我有一个很大的文件a(由电子邮件组成),每封邮件一行。我还有另一个文件B,其中包含另一组邮件。
我将使用哪个命令从文件A中删除文件B中出现的所有地址。
因此,如果文件A包含:
A
B
C
文件B包含:
B
D
E
那么文件A应该剩下:
A
C
现在我知道这是一个可能经常被问到的问题,但我只在网上找到一个命令,它给我一个错误的分隔符。
任何帮助都将不胜感激!肯定有人会想出一个聪明的俏皮话,但我不是shell专家。
我有一个很大的文件a(由电子邮件组成),每封邮件一行。我还有另一个文件B,其中包含另一组邮件。
我将使用哪个命令从文件A中删除文件B中出现的所有地址。
因此,如果文件A包含:
A
B
C
文件B包含:
B
D
E
那么文件A应该剩下:
A
C
现在我知道这是一个可能经常被问到的问题,但我只在网上找到一个命令,它给我一个错误的分隔符。
任何帮助都将不胜感激!肯定有人会想出一个聪明的俏皮话,但我不是shell专家。
当前回答
删除出现在另一个文件上的行后获取该文件
comm -23 <(sort bigFile.txt) <(sort smallfile.txt) > diff.txt . com
其他回答
为了给上面的用户添加Python回答,这里有一个更快的解决方案:
python -c '
lines_to_remove = None
with open("partial file") as f:
lines_to_remove = {line.rstrip() for line in f.readlines()}
remaining_lines = None
with open("full file") as f:
remaining_lines = {line.rstrip() for line in f.readlines()} - lines_to_remove
with open("output file", "w") as f:
for line in remaining_lines:
f.write(line + "\n")
'
提高集合减法的幂。
您可以这样做,除非您的文件已排序
diff file-a file-b --new-line-format="" --old-line-format="%L" --unchanged-line-format="" > file-a
——new-line-format用于文件b中但不在文件a中的行 ——老. .是在文件a中但不在文件b中的行吗 ——不变. .是同时存在于两者中的行。 %L使行被精确地打印出来。
man diff
欲知详情
你可以使用- diff fileA fileB | grep "^>" | cut -c3- > fileA
这也适用于没有排序的文件。
另一种方法来做同样的事情(也需要排序输入):
join -v 1 fileA fileB
在Bash中,如果文件没有预先排序:
join -v 1 <(sort fileA) <(sort fileB)
你可以使用Python:
python -c '
lines_to_remove = set()
with open("file B", "r") as f:
for line in f.readlines():
lines_to_remove.add(line.strip())
with open("file A", "r") as f:
for line in [line.strip() for line in f.readlines()]:
if line not in lines_to_remove:
print(line)
'