IE:
文件:
1234:abcd
1234:930
1234:999999
194:keee
194:284
194:222222
结果:
1234:abcd:930:999999
194:kee:284:222222
尽我所知,我已经筋疲力尽了,无法想出办法。抱歉打扰你们!
答案 0 :(得分:3)
$ awk -F: '$1==last {printf ":%s",$2; next} NR>1 {print "";} {last=$1; printf "%s",$0;} END{print "";}' file
1234:abcd:930:999999
194:keee:284:222222
-F:
这告诉awk
使用:
作为字段分隔符。
$1==last {printf ":%s",$2; next}
如果此行的第一个字段与最后一行的第一个字段相同,则打印冒号后跟字段2.然后,跳过其余命令并从下一行重新开始。
NR>1 {print "";}
如果我们到达此处,则意味着此行具有第一个字段的新的未见前值。如果这不是第一行,我们通过打印换行符完成最后一行。
{last=$1; printf "%s",$0;}
使用字段1的新值更新变量last
。然后,打印此行。
END{print "";}
在我们到达文件末尾后,打印最后一个换行符。
考虑这个测试文件:
$ cat testfile2
3:abcd
4:abcd
10:123
3:999
4:999
10:123
应用此awk脚本:
$ awk -F: '{a[$1]=a[$1]":"$2;} END{for (x in a) print x ":" substr(a[x],2);}' testfile2
3:abcd:999
4:abcd:999
10:123:123
在这种方法中,线条不一定以任何特定顺序出现。如果订单很重要,您可能希望将此输出传递给sort
。