删除两个制表符分隔文件中的匹配行

时间:2018-08-20 21:22:55

标签: bash shell awk

我有2个制表符分隔的文件

A 2
A 5
B 4
B 5
C 10

A 2
A 5
B 5

我想删除file1中file2中的行,以便输出为:

B 4
C 10

我尝试过:

awk 'NR==FNR{c[$1$2]++;next};!c[$1$2] > 0' file2 file1 > file3 

但是它删除的行比预期的多。

1026997259 file1 
   1787919 file2 
1023608359 file3

如何修改此代码,以便:

我有2个制表符分隔的文件

A 2 3
A 5 4
B 4 5
B 5 5
C 10 12

A 2 5
A 5 4
B 5 3 
F 6 7

仅基于第一列和第二列,我想抓取file1中同样位于file2中的行,以便输出为:

B 5 5
C 10 12

3 个答案:

答案 0 :(得分:2)

为什么不使用grep命令?

grep -vf file2 file1

答案 1 :(得分:1)

考虑一下-如果将/** * @ORM\Id * @ORM\Column(length=24) * @ORM\GeneratedValue(strategy="CUSTOM") * @ORM\CustomIdGenerator(class="App\ORM\Generators\ObjectIdGenerator") */ protected $id; ab c串联在一起,它们都将变成a cb,那么您认为您的代码在abc上做什么?按预期使用SUBSEP($1$2)并将$1,$2更改为!c[$1$2] > 0。还要考虑!(($1,$2) in c)!c[$1$2] > 0还是!(c[$1$2] > 0)的意思。我绝对不会写以前的代码,所以idk总是会用解析器编写,因为我希望将其解析。也是这样:

(!c[$1$2]) > 0

或者仅使用awk 'NR==FNR{c[$1,$2];next} !(($1,$2) in c)' file2 file1 代替$0

$1,$2

答案 2 :(得分:1)

如果两个文件中的匹配行相同,并且两个文件以相同顺序排序,则 comm (1)可以解决问题:

comm -23 file1 file2

它打印出仅在第一个文件中的行(除非给出-1),仅在第二个文件中的行(除非-2)和两个文件中的行(除非-3)。如果您启用了多个选项,那么它们将被打印在多个(制表符分隔)列中。