awk命令有条件地比较两行连续的不同列

时间:2019-02-25 20:18:33

标签: awk

这是我的示例输入文件:

xxxxx,12345,yy,ABN,ABE,47,20171018130030,122021010147421,2,IN,3,13,9741588177,32
xxxxxx,9741588177,yy,ABN,ABE,54,20171018130030,122025010227014,2,IN,3,15,12345,32

我要将此文件中的连续两行与以下条件进行比较:

  1. 第一行的第12个字段和第二行的第12个字段必须分别为13和15。
  2. 如果满足点1的条件,则第1行的第2个字段(第12个字段的值为13)必须与第2行的第13个字段(第12个字段为15)匹配。

文件中包含许多不满足上述条件的行,我只想打印满足条件1和2的行。

在这方面的任何帮助都将不胜感激!

3 个答案:

答案 0 :(得分:0)

不清楚是要比较2组(即比较行1和2,然后比较行3和4)还是串行比较(即比较行1和2,然后比较2和3) 。对于后者:

awk 'NR > 1 && prev_12 == 13 && $12 == 15 && 
    prev_2 == $13 {print prev; print $0} 
    {prev=$0; prev_12=$12; prev_2=$2}' FS=, input-file

对于前者,添加条件NR % 2 == 0。 (我假设您打算提到字段是用逗号分隔的,这似乎是由输入判断的情况。)

答案 1 :(得分:0)

另一个awk

$ awk -F, '$12==13 {p0=$0; p2=$2; c=1; next} 
           c&&c-- && $12==15 && p2==$13 {print p0; print}' file

仅当第一行$12的初始匹配时才开始捕获。

c&&c--是一个智能计数器(此处为递减计数),它将停止为0(由于“&”号之前的第一个c)。埃德·莫顿(Ed Morton)的帖子中提供了更多smart counters

的示例

答案 2 :(得分:0)

希望您使用了多行示例输入并提供了预期的输出,所以我们不仅要猜测,还可以这样做:

$ cat tst.awk
BEGIN { FS="," }
(p[12] == 13) && ($12 == 15) && (p[2] == $13) { print p[0] ORS $0 }
{ split($0,p); p[0]=$0 }

$ awk -f tst.awk file
xxxxx,12345,yy,ABN,ABE,47,20171018130030,122021010147421,2,IN,3,13,9741588177,32
xxxxxx,9741588177,yy,ABN,ABE,54,20171018130030,122025010227014,2,IN,3,15,12345,32