2012-04-28 4 views
0

У меня есть файл со следующими данными: -AWK разбор месяц с даты в переменные

2012/02/17 154.89 24.00  3.72 0.098  0.36 0.188  0.050  0.03 0.58 
2012/02/18 238.16 24.00  5.72 0.098  0.56 0.188  0.050  0.04 0.79 
2012/03/19 155.55 24.00  3.73 0.098  0.37 0.188  0.050  0.03 0.58 
2012/03/20 186.00 24.00  4.46 0.098  0.44 0.188  0.050  0.03 0.66 
2012/04/21 487.86 8.87   4.33 0.098  0.42 0.188  0.050  0.03 0.64 
2012/04/22 264.32 24.00  6.34 0.098  0.62 0.188  0.050  0.04 0.85 
2012/04/23 328.65 23.99  7.89 0.098  0.77 0.188  0.050  0.05 1.01 
2012/04/24 155.31 24.00  3.73 0.098  0.37 0.188  0.050  0.03 0.58 
2012/04/25 229.36 24.00  5.50 0.098  0.54 0.188  0.050  0.04 0.76 
2012/04/26 153.45 24.00  3.68 0.098  0.36 0.188  0.050  0.03 0.58 

У меня есть следующий сценарий AWK, когда изменяется поле даты она выводит «дифф».

awk '{print $1,l} NR!=1 && $1!=l {print "diff"} {l=$1}' MyFile 

Который производит следующий вывод: -

2012/02/17 
2012/02/18 2012/02/17 
diff 
2012/03/19 2012/02/18 
diff 
2012/03/20 2012/03/19 
diff 
2012/04/21 2012/03/20 
diff 
2012/04/22 2012/04/21 
diff 
2012/04/23 2012/04/22 
diff 
2012/04/23 2012/04/23 
2012/04/23 2012/04/23 
2012/04/23 2012/04/23 
2012/04/23 2012/04/23 
2012/04/24 2012/04/23 
diff 
2012/04/25 2012/04/24 
diff 
2012/04/26 2012/04/25 
diff 
2012/04/26 
diff 

Как бы я изменить сценарий, чтобы сказать ему, только распечатать «дифф», когда месяц в дате изменения (среднее число) и не вся дата?

ответ

2

Разделить первое поле на основе разделителя "/". Используйте этот результат для сравнения.

$ awk ' 
> {print $1, l; split($1, m, "/");} 
> NR!=1 && m[2]!=l {print "diff";} 
> {l=m[2];}' MyFile 
2012/02/17 
2012/02/18 02 
2012/03/19 02 
diff 
2012/03/20 03 
2012/04/21 03 
diff 
2012/04/22 04 
2012/04/23 04 
2012/04/24 04 
2012/04/25 04 
1

Надеется, что это должно работать:

awk -F'[ \t/]' ' 
{d=$1 "/" $2 "/" $3; print d, od; od = d} 
NR!=1 && $2!=l {print "diff"} 
{l=$2}' FILE