我有一个具有这种格式内容的文件:
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/