假设我有setA.txt
:
a|b|0.1
c|d|0.2
b|a|0.3
我也有setB.txt
:
c|d|200
a|b|100
现在,我要从setA.txt
与前两个字段相同的行中删除setB.txt
,因此输出应为:
b|a|0.3
我试过:
comm -23 <(sort setA.txt) <(sort setB.txt)
但是等式是为整行定义的,因此它将不起作用。我怎样才能做到这一点?
$ awk -F\| 'FNR==NR{seen[$1,$2]=1;next;} !seen[$1,$2]' setB.txt setA.txt
b|a|0.3
这将setB.txt
只读取一次,从中提取所需的信息,然后setA.txt
在决定打印哪些行的同时进行读取。
-F\|
这会将字段分隔符设置为竖线|
。
FNR==NR{seen[$1,$2]=1;next;}
FNR是到目前为止从当前文件读取的行数,而NR是读取的总行数。因此,当时FNR==NR
,我们正在读取第一个文件setB.txt
。如果是这样,则将由字段1和2组成的键将关联数组的值设置seen
为true 1
。最后,跳过其余命令,然后重新开始next
。
!seen[$1,$2]
如果获得此命令,我们正在处理第二个文件setA.txt
。由于!
表示否定,因此条件为true(如果seen[$1,$2]
为false),这表示字段1和2的组合不在中setB.txt
。如果是这样,则执行默认操作,即打印该行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句