【问题标题】:how to find unique rows in a large file?如何在大文件中查找唯一行?
【发布时间】:2013-08-13 00:34:40
【问题描述】:

我有一个大文件(40 亿行),每行包含一个单词。我想找到唯一单词的列表和相应的计数。

我试过了:

sort largefile |uniq -c >outfile

但它仍在运行并且没有输出。

然后我尝试了:

awk '!arr[$1]++' largefile >outfile

但它不打印计数。我怎样才能使用 awk 来打印计数?或任何其他可以处理大文件的替代方法。

编辑:文件中有大约 1700 万个唯一词。

【问题讨论】:

  • 猫大文件 | awk '{printf("%s %d\n",$1,arr[$1]++)}' |排序-n
  • 这被称为“有错误的数据”,或者可能是“滥用了一个荒谬的数据结构”。如果您有 40 亿个数据,那么如果您尝试优化速度,那么平面文件可能是错误的选择。
  • 如果你告诉sort 使用尽可能多的内存,它会运行得更快、更快。例如sort -S 8G ...,如果您在 64 位系统上运行,内存超过 8G(并且您的排序是 64 位可执行文件)
  • 有时您可以使用sort -u 来处理较大的文件

标签: linux bash shell sorting awk


【解决方案1】:

uniq 是要走的路,但 40 亿行只是很多行。如果您经常需要这些信息,我会设置一个数据库并导入行。这将加速基于索引的查询。但是,40 亿行是很多行

【讨论】:

    【解决方案2】:

    你的第一个例子是好的。试着做:

    sort largefile | uniq -c
    

    这需要一些时间。

    【讨论】:

      【解决方案3】:

      使用 split -l 1000000 预处理文件,将文件拆分为 40 个 1,000,000 行文件,使用 sort -u 对它们进行排序。将它们合并到一个大文件中,再给它排序 -u。

      ## if you use just this, you need gawk 4.1
      #
      gawk '{key[$0]++;} END { for( word in key ) { print key[word] "\t" word }}' bigfile
      
      
      cd to directory with bigfile
      split -l 1000000 bigfile aa, small    ## makes smallaa, smallab, etc.
      
      for files in small*
      do
        echo "Sorting file $files"
        sort -u $files -o $files.srt
      done
      
      sort -m *.srt -o bigagain
      sort -u bigagain > smallish
      
      now have words but no counts.
      gawk '{key[$0]++;}' smallish bigfile   # or better yet
      

      【讨论】:

      • 分开和享受
      【解决方案4】:

      文件有多大?你期待多少个独特的词?在大多数情况下,您的sort | uniq 解决方案是一个好的开始,但显然如果文件太大,那就不好了。将每个单词保存在哈希中的 Perl 脚本可能对您有用。

      这是未经测试的,来自记忆,所以它可能有一堆错误......

      my %words = ();
      open(IN, "<", "yourfile") or die "Arrgghh file didn't open: $!";
      while(<IN>) {
          chomp;
          $words{$_}++;
      }
      close(IN);
      for my $k in (keys %words) {
          print "$k $words{$k}\n";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-11
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        相关资源
        最近更新 更多