如何删除两个文件之间的公共行而不进行排序?

har*_*on4 15 sorting bash optimization sed comm

我有两个没有分拣的文件有一些共同点.

FILE1.TXT

Z
B
A
H
L
Run Code Online (Sandbox Code Playgroud)

FILE2.TXT

S
L
W
Q
A
Run Code Online (Sandbox Code Playgroud)

我用来删除公共行的方式如下:

sort -u file1.txt > file1_sorted.txt
sort -u file2.txt > file2_sorted.txt

comm -23 file1_sorted.txt file2_sorted.txt > file_final.txt
Run Code Online (Sandbox Code Playgroud)

输出:

B
H
Z
Run Code Online (Sandbox Code Playgroud)

问题是我想保留file1.txt的顺序,我的意思是:

期望的输出:

Z
B
H
Run Code Online (Sandbox Code Playgroud)

我试过的一个解决方案是循环读取file2.txt的所有行:

sed -i '/^${line_file2}$/d' file1.txt
Run Code Online (Sandbox Code Playgroud)

但如果文件很大,性能可能会很糟糕.

  • 你喜欢我的想法吗?
  • 你还有其他选择吗?

per*_*eal 18

你可以只用grep(-v用于反转,-f用于文件).从input1那里的Grep线与以下任何一行都不匹配input2:

grep -vf input2 input1 
Run Code Online (Sandbox Code Playgroud)

得到:

Z
B
H
Run Code Online (Sandbox Code Playgroud)

  • 如果选择`-F -w或-x`会更好吗?例如子串案例. (4认同)

Ken*_*ent 16

grep或awk:

awk 'NR==FNR{a[$0]=1;next}!a[$0]' file2 file1
Run Code Online (Sandbox Code Playgroud)

  • @JohnDoe我们只需要一个非零数字,7和1没有区别.我把它改成1,如果它让你感觉舒服.:-) (2认同)
  • 实际上这是最好的方法.grep方法更快.谢谢!:d (2认同)