【问题标题】:How to use awk to delete lines of file1 whose column 1 values exist in file2 in Ubuntu?如何使用 awk 删除 Ubuntu 中 file2 中存在第 1 列值的 file1 行?
【发布时间】: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

顺便说一句,我正在处理数百万行

【问题讨论】:

    标签: linux awk


    【解决方案1】:

    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 解析)。
    【解决方案2】:

    作为替代方案,使用 grep:

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

    【讨论】:

    • 非常感谢!这适用于小型文件,但我正在处理具有数百万行的文件。我运行它并且它仍在运行有没有更快的方法来做到这一点?
    • 无论文本出现在行中的什么位置,这都会删除行。虽然这可能满足这种用法。
    • +1 表示简单的方法,尽管添加 -Fw 选项也可能会有所帮助。我同意 Etan 提出的警告。只有 OP 可以确认。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多