2014-08-29 50 views

回答

2

awk 'NR==FNR{seen[$0]++; next} !seen[$1]' file2.csv FS=, file1.csv应该做你想要什么,但它需要足够的内存来存储在file2.csv每行一个条目。

+0

或许可以考虑将'$ 0'改为'$ 1',否则'file2.csv'中的某个空格可能会干扰匹配。 – Scrutinizer 2014-08-29 10:17:36

+0

我特别使用'$ 0'来避免'file2.csv中带引号的字符串中的空格问题'。我认为它们也会存在于'file1.csv'中的带引号的字符串中,并且希望被匹配为整个单元。 'file1.csv'用'FS ='解析,所以不会在空格上分割(但'file2.csv'用'FS'的默认值解析)。 – 2014-08-29 11:27:12

+0

是的好点,双引号内可能有空格...... – Scrutinizer 2014-08-29 11:34:37

1

作为替代,用grep:

$ grep -vf file2.csv file1.csv 
"agvsad",314 
"gregerg",413 
+0

非常感谢!这适用于小文件,但我正在处理数百万行的文件。我运行它,它仍然运行有没有更快的方法来做到这一点? – user3692521 2014-08-29 00:29:29

+1

无论文本在文本中出现的位置如何,都将删除这些行。虽然这可能会满足这种用法。 – 2014-08-29 00:29:38

+2

+1表示简单的方法,但也可以添加'-Fw'选项。我同意Etan提出的警告。只有OP可以确认。 – 2014-08-29 00:44:22

相关问题