从一个文件中删除与另一个文件中的行匹配的行的最简单方法是什么?例如,如果我有以下文件:
文件1.csv:
[email protected]
文件2.csv:
1,[email protected],somehash1
2,[email protected],somehash2
3,[email protected],somehash3
因此,我希望文件3.csv:
1,[email protected],somehash1
3,[email protected],somehash3
解决这个任务的最快方法是什么?这些文件大小为几 GB。
答案1
grep -v -F -f file1.csv file2.csv > file3.csv
看起来最简单。但你应该先用较小的文件进行性能测试。(我同意 soandos 的评论,即这种大文件可能需要专门的解决方案。)
答案2
awk -F, '
FILENAME == ARGV[1] {to_remove[$1]=1; next}
! ($2 in to_remove) {print}
' file1.csv file2.csv > file3.csv
您必须有足够的内存来一次读取文件1。
这是另一个选择:join
$ join -t , -v 2 -1 1 -2 2 file1.csv file2.csv
[email protected],1,somehash1
[email protected],3,somehash3
但是,从手册页来看“重要:FILE1和FILE2必须按连接字段排序。”所以请将此因素纳入您的决策中。
答案3
您可以循环遍历文件 1 中的每一行,并从文件 2 中 grep 匹配的行吗?
cp file2.csv file3.csv
cat file1.csv | while read line; do
grep -v ${line%?} file3.csv > temp.csv
cat temp.csv > file3.csv
done
rm -f temp.csv
未经测试。
编辑:经过测试,似乎可以正常工作。只需确保 file1 中有一个尾随换行符即可。
答案4
确保 file3.csv 存在(并且为空)
echo > file3.csv
diff file1.csv file2.csv | patch file3.csv
瞧!