AWK从日期到变量解析月份

时间:2012-04-28 10:27:26

标签: linux bash 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脚本,当日期字段更改时,它会打印出“diff”。

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

如何修改脚本告诉它,只在日期中的月份(中间数字)而不是整个日期打印出“diff”?

2 个答案:

答案 0 :(得分: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 :(得分:1)

希望这应该有效:

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