【问题标题】:awk: how to remove duplicated lines in a file and output them in another file at the same time?awk:如何删除文件中的重复行并同时将它们输出到另一个文件中?
【发布时间】:2012-11-17 22:37:26
【问题描述】:

我目前正在编写一个处理 csv 文件的脚本,它所做的一件事就是删除并记录文件中的重复行。我当前执行此操作的方法是使用 uniq -d 一次运行 uniq 以显示所有重复项,然后再次运行 uniq 而不使用任何选项来实际删除重复项。 话虽如此,我想知道是否可以在一个操作中执行相同的功能,而不必运行 uniq 两次。我发现了许多使用 awk 删除重复项的不同示例,但据我所知,我无法找到任何既显示重复项又同时删除它们的示例。 如果有人可以为此提供建议或帮助,我将不胜感激,谢谢!

【问题讨论】:

  • 所有文本操作问题的股票答案:是的,这在 awk 中是微不足道的。现在——你想做什么?发布一些小样本输入,在该输入上运行所需工具后的预期输出,并解释为什么会是输出。

标签: bash csv awk uniq


【解决方案1】:

以下是帮助您入门的内容:

awk 'seen[$0]++{print|"cat>&2";next}1' file > tmp && mv tmp file

上面将在从输入文件中删除它们的同时将任何重复的行打印到 stderr。如果您需要更多,请告诉我们更多......

【讨论】:

    【解决方案2】:

    一般情况下,您输入的大小将作为您的指导。如果您正在处理 GB 级的数据,您通常别无选择,只能依赖 sortuniq,因为这些工具支持 external 操作。

    也就是说,这是 AWK 的方式:

    • 如果您的输入已排序,您可以通过将i 行与i-1 行与O(1) 状态进行比较来轻松跟踪AWK 中的重复项:如果@987654326 @你有一个副本。

    • 如果你的输入没有排序,你必须跟踪所有行,需要O(c)状态,其中c em> 是唯一行数。为此,您可以在 AWK 中使用哈希表。

    【讨论】:

      【解决方案3】:

      此解决方案不使用awk,但它确实产生了您需要的结果。在下面的命令中,将 sortedfile.txt 替换为您的 csv 文件。

      cat sortedfile.txt | tee >(uniq -d > duplicates_only.txt) | uniq > unique.txt
      

      teecat 命令的输出发送到uniq -d

      【讨论】:

      • 不过,不要再使用 Cat 了。
      猜你喜欢
      • 2016-04-10
      • 2014-05-23
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2016-05-08
      相关资源
      最近更新 更多