【问题标题】:How to sort out duplicates from a massive list using sort, uniq or awk?如何使用 sort、uniq 或 awk 从大量列表中分出重复项?
【发布时间】:2017-01-06 09:16:20
【问题描述】:

我有一个 12Gb 的组合哈希列表文件。我需要找到其中的重复项,但我遇到了一些问题。

使用cat *.txt > _uniq_combined.txt 合并了一些 920(uniq'd)列表,从而产生了一个巨大的哈希列表。合并后,最终列表将包含重复项。

我以为我已经用 awk '!seen[$0]++' _uniq_combined.txt > _AWK_duplicates.txt && say finished ya jabroni 解决了这个问题

awk '!seen[$0]++' _uniq_combined.txt > _AWK_duplicates.txt 生成一个大小为4574766572 字节的文件。

有人告诉我,不可能有这么大的文件,然后再试一次。

sort _uniq_combined.txt | uniq -c | grep -v '^ *1 ' > _SORTEDC_duplicates.txt 生成一个大小为1624577643 字节的文件。明显更小。

sort _uniq_combined.txt | uniq -d > _UNIQ_duplicates.txt 生成一个大小为1416298458 字节的文件。

我开始认为我不知道这些命令的作用,因为文件大小应该相同。

同样,目标是查看一个巨大的列表并保存多次看到的哈希实例。这些结果中哪一个(如果有)是正确的?我以为他们都做同样的事情。

【问题讨论】:

  • 好吧,最后两个应该不同,因为第一个包含相同的行数,另一个没有。
  • @MladenJablanović 我不确定我是否在关注。他们都对原始文件进行排序或操作 - _uniq_combined.txt,不是吗?
  • 您是否尝试通过diff 或cmp 来区分_SORTEDC_duplicates.txt 和_UNIQ_duplicates.txt?如果它说明了什么,请跟踪原始文件中不同的行。
  • @oliv 我不熟悉 diff,这能告诉我什么?
  • @dsp_099 它将输出两个文件之间不同的行...

标签: bash sorting awk duplicates


【解决方案1】:

sort 也是专门为处理大文件而设计的。你可以这样做:

cat *.txt | sort >all_sorted 
uniq all_sorted >unique_sorted
sdiff -sld all_sorted unique_sorted | uniq >all_duplicates

【讨论】:

  • 不确定我是否理解最后一行。合并所有,uniq合并的文件,然后找出两者之间的差异并将其输出?
  • all_duplicates 的结果也为零,这是不可能的
  • -s 表示左右参数共有的行被删除。由于右参数是sdiff 中左参数的子集,这意味着左列仅包含重复行。 -l 意味着我们只打印左列。由于每个重复行可能会出现多次,因此使用最终的uniq 对其进行压缩。如果您的最终输出为空,您可以调查发生这种情况的位置。例如,您可以先执行sdiff -d all_sorted unique_sorted|less -n,然后查看重复项在哪里。
  • sort *.txt > all_sorted 可以。我认为你可以在最后一行使用comm -2。
【解决方案2】:

sort 命令应该适用于 12 GB 的文件。如果您指定 -d 或 -D 选项,uniq 将只输出重复的行。那就是:

sort all_combined > all_sorted
uniq -d all_sorted > duplicates

或

uniq -D all_sorted > all_duplicates

-d 选项为每个重复的元素显示一行。所以如果 "foo" 出现 12 次,它会显示 "foo" 一次。 -D 打印所有个重复项。

uniq --help 将为您提供更多信息。

【讨论】:

    【解决方案3】:

    也许如果您将split 那个大文件变成更小的文件,sort --unique 将它们删除并尝试将它们与sort --merge 合并:

    $ cat > test1
    1
    1
    2
    2
    3
    3
    $ cat > test2
    2
    3
    3
    4
    4
    $ sort -m -u test1 test2
    1
    2
    3
    4
    

    我想合并排序的文件不会发生在内存中?

    【讨论】:

    • 庞大的文件必须由所有较小的文件组成,因为这就是受骗者如何让自己知道的方式。列表 1、2、3、99、132 可能没有任何欺骗,但列表 1 和列表 920 可能。所以因此合并。我的问题是为什么这些命令会产生截然不同的结果?
    【解决方案4】:

    我认为您的 awk 脚本不正确,您的 uniq -c-command 包含重复出现的次数,而 sort _uniq_combined.txt | uniq -d 是正确的 :)。

    请注意,您可以直接使用sort *.txt > sorted_hashes 或sort *.txt -o sorted_hashes。

    如果您手头只有两个文件,请考虑使用comm(info coreutils 进行救援),它可以为您提供“仅在第一个文件中的行”、“仅在第二个文件中的行”、“两个文件中的行”。如果您只需要其中一些列,您可以使用 comm 选项来抑制其他列。或者使用生成的输出作为基础并使用cut 继续处理它,例如cut -f 1 my_three_colum_file 以获取第一列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 2020-04-05
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 2020-11-25
      相关资源
      最近更新 更多