【发布时间】:2014-08-29 00:09:26
【问题描述】:
假设我们有这样的 file1.csv
"agvsad",314
"gregerg",413
"dfwer",53214
"fewf",344
和这样的file2.csv
"dfwer"
"fewf"
如何使用 awk 删除 file2 中存在第 1 列值的行,并获取 file3 如下所示:
"agvsad",314
"gregerg",413
顺便说一句,我正在处理数百万行
【问题讨论】:
假设我们有这样的 file1.csv
"agvsad",314
"gregerg",413
"dfwer",53214
"fewf",344
和这样的file2.csv
"dfwer"
"fewf"
如何使用 awk 删除 file2 中存在第 1 列值的行,并获取 file3 如下所示:
"agvsad",314
"gregerg",413
顺便说一句,我正在处理数百万行
【问题讨论】:
awk 'NR==FNR{seen[$0]++; next} !seen[$1]' file2.csv FS=, file1.csv 应该做你想做的事,但它需要足够的内存来为 file2.csv 中的每一行存储一个条目。
【讨论】:
$0改为$1,否则file2.csv中某处的单个空格可能会干扰匹配..
$0 来避免file2.csv 中引用字符串中的空格问题。我假设它们也将存在于file1.csv 的引用字符串中,并且希望作为整个单元进行匹配。 file1.csv 使用 FS=, 解析,因此不会在空格上拆分(但 file2.csv 使用默认值 FS 解析)。
作为替代方案,使用 grep:
$ grep -vf file2.csv file1.csv
"agvsad",314
"gregerg",413
【讨论】:
-Fw 选项也可能会有所帮助。我同意 Etan 提出的警告。只有 OP 可以确认。