【问题标题】:Delete entries from CSV from second CSV file从第二个 CSV 文件中删除 CSV 中的条目
【发布时间】:2020-10-30 10:07:46
【问题描述】:

我正在尝试从 second.csv 中删除在 first.csv 中找到的条目

我的 first.csv 看起来像这样:

surname,lastname,,,website-link,country,None,city,,,email,,,phonenumber,,,,

我的 second.csv 仅包含电子邮件地址。所以我想删除 first.csv 中所有匹配的电子邮件。

例子:

first.csv:

mike,pence,,,www.google.de,germany,None,Berlin,,,mike@pence.de,,,01769921323,,,,
frank,schwarz,,,www.bund.de,germany,None,München,,,frank@google.de,,,01469425323,,,,

second.csv:

frank@google.de

输出(first.csv)应该是:

mike,pence,,,www.google.de,germany,None,Berlin,,,mike@pence.de,,,01769921323,,,,

我可以通过 mac 终端实现吗?

【问题讨论】:

  • 您要删除整个记录还是只删除电子邮件地址?你有没有尝试过?
  • 如何迭代第一个以列出所有邮件地址(使用正则表达式),然后在第二个中替换为每个找到的行?
  • @JamesBrown 我想删除整条记录,我尝试了很多在这里找到的东西,但对我的情况不起作用
  • @Larme 抱歉,我现在不知道该怎么做

标签: bash macos csv terminal


【解决方案1】:

使用 awk 读取两个文件

awk -F, 'NR==FNR {mail[$1]=1} NR !=FNR { if (mail[$11]!=1) { print $0 } }' csvb csva

处理第二个文件 (csvb) - NR=FNR 时,构建一个数组邮件,用电子邮件地址和值 1 进行索引。然后在处理第一个文件 (csva) 时 - NR!=FNR,如果没有邮件数组中电子邮件地址($11)的条目,打印该行,否则不要

【讨论】:

    【解决方案2】:
    $ awk -F, '          # using awk, set field separator
    NR==FNR {            # process first file named second
        a[$1]            # hash email address
        next             # proces the next record from the first file
    }                    # beyond this point process second file name first
    !($11 in a)          # if email address in second file not in the first file, output
    ' second first
    

    输出:

    surname,lastname,,,website-link,country,None,city,,,email,,,phonenumber,,,,
    mike,pence,,,www.google.de,germany,None,Berlin,,,mike@pence.de,,,01769921323,,,,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2012-05-28
      • 2022-01-16
      • 1970-01-01
      • 2017-11-19
      相关资源
      最近更新 更多