awk检查变量,字段跟随行

时间:2013-10-21 22:46:51

标签: regex bash awk

我对AWK很新,有疑问我希望有人可以帮助我: 我有一个看起来像这样的模式:

620
621
622
623
624
624 66.75, 150.13
625
625 67.24, 153.31
626
627
628
628 68.14, 151.98

etc,etc

使用awk脚本我试图获得以下结果:我想从我的第一列数字(计数器)中删除重复项并连接我的数据(第2和第3列)。所以我希望我的数据看起来像这样:

620
621
622
623
624 66.75, 150.13
625 67.24, 153.31
626
627
628 68.14, 151.98

到目前为止,我一直在尝试将第一个字段存储在变量中,然后测试以下数字是否相等。但是我认为如果找到重复的字段,我必须做一些事情,然后返回一步并更改先前打印的变量。我怎么能用AWK做到这一点?非常感谢!

3 个答案:

答案 0 :(得分:2)

此行适用于您的示例:

 awk '{a[$1]=$0}END{for(x in a)print a[x]}' file

试验:

kent$  awk '{a[$1]=$0}END{for(x in a)print a[x]}' file
620
621
622
623
624 66.75, 150.13
625 67.24, 153.31
626
627
628 68.14, 151.98

但请注意for (x in a)不保证在您的文件中遵循相同的顺序,尽管它适用于问题中的示例数据。如果希望结果按第1列排序。最简单的方法是将awk输出传递给sort -n,所以我们有:

 awk '{a[$1]=$0}END{for(x in a)print a[x]}' file|sort -n

答案 1 :(得分:1)

对Kent的代码进行一次小调整(假设多行可以包含数据)

awk '{i=$1;sub(/[0-9]*/,"");a[i]=sprintf("%s %s", a[i], $0);}END{for(x in a)printf("%s %s\n", x, a[x]);}' td | sort

如果多行可以包含数据,则将它们连接在一起。

答案 2 :(得分:0)

无需将整个文件存储在内存中:

awk 'l==$1{$1=""; printf ",%s", $0; next}
  {l=$1; printf("%s%s", NR==1?"":"\n", $0)}
  END{ print ""}' input-file