有两个文件:

file1: 
a 
b 
c 
d 
 
file2: 
a 
b 
f 
c 
d 
e 
 
output file (file2) should be: 
f 
e 

我希望file1中的行应该直接在file2中删除。我希望输出不应该是一个新文件。应该直接删除文件2中的。当然也可以创建一个临时文件。 我的真实文件二包含超过 300.000 行。这就是一些解决方案的原因:

comm -13 file1 file2 

不起作用。

请您参考如下方法:

comm 需要对输入文件进行排序。您可以使用进程替换来实现:

#!/bin/bash 
comm -13 <(sort file1) <(sort file2) > tmp_file 
mv tmp_file > original_file 

输出:

e 
f 

或者,如果您有足够的内存,则可以使用以下 awk 命令,该命令不需要对输入进行排序:

awk 'NR==FNR{a[$0];next} !($0 in a)' file1 file2 

输出(保留排序顺序):

f 
e 

请记住,数组a的大小直接取决于file1的大小。

PS:也可以使用grep -vFf file1 file2,内存要求与awk解决方案相同。鉴于此,我可能只会使用 grep


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!