【问题标题】:Remove duplicates from INSANE BIG WORDLIST从 INSANE BIG WORDLIST 中删除重复项
【发布时间】:2018-09-03 15:35:42
【问题描述】:

这样做的最佳方法是什么?这是一个 250GB 的文本文件,每行 1 个单词

输入:

123
123
123
456
456
874
875
875
8923
8932
8923

想要的输出:

123
456
874
875
8923
8932

如果有 2 条相同的行,我需要为每条重复的行获取 1 个副本,删除两个,只删除 1 个,始终保留 1 个唯一行。

我现在做什么:

$ cat final.txt | sort | uniq > finalnoduplicates.txt

在屏幕中,这有效吗?我不知道,因为当我检查输出文件的大小时,它是 0:

123user@instance-1:~$ ls -l
total 243898460
-rw-rw-r-- 1 123user 249751990933 Sep  3 13:59 final.txt
-rw-rw-r-- 1 123user            0 Sep  3 14:26 finalnoduplicates.txt
123user@instance-1:~$

但是当我检查 htop 运行此命令的屏幕的 cpu 值是 100% 时。

我做错了吗?

【问题讨论】:

  • 我会失去无用的cat,因为sort 完全能够自行读取文件。我还建议您使用-u 选项来消除uniq
  • 那么 "cat final.txt | sort -u | uniq > finalnoduplicates.txt" ?
  • 这些行是否按照您的示例进行排序?
  • 您可能会看到一个空文件,因为您在sort 完成排序之前正在查看它,并且尚未输出任何内容。对这么多数据进行排序需要一段时间。而且,是的,不要使用catuniq。这两个都不需要;它应该用一个程序来完成。而且由于您的文件看起来全是数字,因此可能会告诉sort,以便它按数字对文件进行排序:sort -o results.txt -nu file.txt 或类似的。

标签: linux sorting debian uniq


【解决方案1】:

您只需使用 sort 即可完成此操作。

$ sort -u final.txt > finalnoduplicates.txt

您可以进一步简化此操作,只需让 sort 完成所有操作:

$ sort -u final.txt -o finalnoduplicates.txt

最后,由于您的输入文件纯粹是数字数据,您可以通过-n 开关告诉sort 以进一步提高此任务的整体性能:

$ sort -nu final.txt -o finalnoduplicates.txt
sort 的手册页
   -n, --numeric-sort
          compare according to string numerical value

   -u, --unique
          with -c, check for strict ordering; without -c, output only the
          first of an equal run

   -o, --output=FILE
          write result to FILE instead of standard output

【讨论】:

  • 使用-o 比重定向有什么好处吗?
  • @Hashim - 一些,sort 命令正在构建文件,而重定向依赖于 shell 来完成。
猜你喜欢
  • 2013-12-13
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2019-08-04
  • 2015-09-30
  • 2018-08-21
  • 2013-12-17
  • 2015-10-11
相关资源
最近更新 更多