首页 > 解决方案 > 如果发现出现,则删除每一行

问题描述

我有一个具有这种格式内容的文件:

1  6  8
1  6  9
1  12 20
1  6
2  8
2  9
2  12
2  20
2  35

如果在下一行中找到数字(从第 2 列或第 3 列但不是从第 1 列),我想删除所有行,无论它是在第 2 列还是第 3 列,包括找到初始数字的行。

我应该将其作为输出:

2 35

我试过使用:

awk '{for(i=2;i<=NF;i++){if($i in a){next};a[$i]}} 1' 

但它似乎不起作用。

怎么了 ?

标签: awksedcat

解决方案


一次性 awk 将所有记录散列到并为 fields 中看到的值r[NR]保留另一个数组。a[$i]$2,...NF

awk ' {
    for(i=2;i<=NF;i++)       # iterate fields starting from the second
        if($i in a) {        # if field value was seen before
            delete r[a[$i]]  # delete related record
            a[$i]=""         # clear a
            f=1              # flag up
        } else {             # if it was not seen before
            a[$i]=NR         # add record number to a
            r[NR]=$0
        }
    if(f!=1)                 # if flag was not raised
        r[NR]=$0             # store record on record number
    else                     # if it was raised
        f=""                 # flag down
}
END {
    for(i=1;i<=NR;++i)
        if(i in r)
            print r[i]       # output remaining
}' file

输出:

2  35

推荐阅读