我有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
答案 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
)。如果您启用了多个选项,那么它们将被打印在多个(制表符分隔)列中。