awk - 删除找到的每一行

标签 awk sed cat

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

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' 

但是好像不行。

怎么了?

最佳答案

一次性 awk 将所有记录散列到 r[NR] 并为字段 $2 中看到的值保留另一个数组 a[$i] ,...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

关于awk - 删除找到的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52093050/

相关文章:

linux - 将目录中每个文件的标签之间的文件内容提取到新位置

linux - 如何使用 sed 通过灵活的键和值更改我的配置文件?

Unix 命令获取不包含特定文本的行

bash - HP-UX - 如何在不解压缩的情况下从 tar 存档中读取文本文件?

linux - 在 linux 中过滤文本输出

linux - 使用awk统计某列中某个单词出现的次数

linux - awk 如何提取其他字段 "if duplicates in fields"仅当先前字段相同且大于零时

linux - 我如何从 awk 中的字符串中选择第 s 个值?

mysql - 将列名转换为大写的 MYSQL 脚本

sorting - 按日期合并多个日志文件,包括多行