【问题标题】:Removing more than 2 duplicates from a CSV file从 CSV 文件中删除超过 2 个重复项 [关闭]
【发布时间】:2022-10-21 19:29:10
【问题描述】:

我找到了以下脚本来删除重复项:

awk -F, '!x[$7]++' 'business-records.csv' > 'business-records-deduped.csv'

当它找到重复记录而不是删除所有重复记录并仅保留第一条记录时,如果它可以保留前 2 或 3 条记录并删除其余记录,那就太棒了。所以基本上允许原始和一个重复,但删除超过一两个重复的整行。

如何对其进行调整,使其保留原始记录和第一个重复记录,并删除第一个重复记录之外的所有行?

【问题讨论】:

  • 欢迎来到 SO。很好,您清楚地解释了您想要什么,并发布了当前代码。对我来说,使用更少的文本会更容易,并提供一个简单的输入数据 + 所需结果的简短示例。你在书面文本中解释。也许未来的职位?

标签: awk


【解决方案1】:

您可以像这样使用awk

awk -F, '++x[$7] <= 2' business-records.csv > business-records-deduped.csv

这将为第 7 列保留 2 条重复记录,并根据需要删除更多重复记录。

【讨论】:

    【解决方案2】:

    我建议以下最小的改进你的代码

    awk -F, '2>x[$7]++' 'business-records.csv' > 'business-records-deduped.csv'
    

    解释:++邮政-increment 操作,因此执行顺序可能有点违反直觉

    • x[$7] 从数组 x 获取值,因为键是第 7 个字段的内容,如果不存在则假定为 0
    • 2&gt; 是关于打印的测试决定,如果这个条件成立,则打印行
    • ++ 确实增加了数组 x 内的值,因此下次遇到相同的第 7 个字段内容值将增大 1

    观察唯一改变的是测试,关于非负整数! 对零为真,对大于 0 的值为假。

    【讨论】:

    • 感谢您提供对元素的解释以及脚本
    • 当然,我测试了将 2 更改为 3 以保留前 3 个副本,并且效果很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2016-03-29
    • 2023-03-27
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多