我对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做到这一点?非常感谢!
答案 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