如果某些字段匹配,则awk追加行

时间:2016-04-01 06:32:02

标签: awk

我绝对是awk的初学者,并希望得到一些帮助。

我有这些数据:

FOO|BAR|1234|A|B|C|D|
FOO|BAR|1234|E|F|G|H|
FOO|BAR|5678|I|J|K|L|
FOO|BAR|5678|M|N|O|P|
FOO|BAR|5678|Q|R|S|T|

期望的输出:

FOO|BAR|1234|A|B|C|D|E|F|G|H|
FOO|BAR|5678|I|J|K|L|M|N|O|P|Q|R|S|T|

基本上我必须将一些字段附加到第3列匹配的行。

感谢任何回复,非常感谢!

2 个答案:

答案 0 :(得分:1)

另一种方式:

 awk -F"|" '$3 in a{
     a[$3]=a[$3]"|"$4"|"$5"|"$6"|"$7;
     next
}
{ a[$3]=$0
}
END {
     for ( i in a) {
         print a[i]
     }
}'

答案 1 :(得分:1)

$ awk -f chain.awk < data
FOO|BAR|1234|A|B|C|D|E|F|G|H|
FOO|BAR|5678|I|J|K|L|M|N|O|P|Q|R|S|T|
$ cat chain.awk 
BEGIN   {FS = "|"}
$3==old {for(i = 4; i <= NF; i++) saved = saved (i>4?"|":"") $i}
$3!=old {if(old) print saved ; saved = $0 ; old = $3}
END     {print saved}
$ 
  • BEGIN我们设置字段分隔符
  • $3==old我们将字段$4 ... $NF附加到已保存的数据中,将|字段与第一个字段相连(注意有最后一个空字段)
  • $3!=old我们打印保存的数据(第一条记录除外,当old为假时)我们重新启动机制
  • END我们仍在保存数据,我们必须将其打印出来