在标准输入上分组和计数行的最佳方法?

在标准输入上分组和计数行的最佳方法?

自古以来,我就习惯... | sort | uniq -c | sort -nr对输入行进行分组和计数,以计算输入中每​​行有多少行。

还有更好的办法吗?我刚刚养成了一个坏习惯吗?有没有更好的方法使用将安装在 Ubuntu Linux 18.04+ 上的标准 unix 工具(或者已经存在的东西apt-get?)

答案1

我认为你有标准的、明显的 *nix 方式。这是一个非常好的、合理的方法:

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | sort | uniq -c | sort -nr
      2 cc
      2 aa
      1 dd
      1 bb

当然,您可以使用一个小脚本来代替,这样就只使用一个命令。例如,与gawk

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | 
  gawk '
    BEGIN{ PROCINFO["sorted_in"] = "@val_num_desc" }
   { count[$0]++ } 
   END{ for(line in count){ print count[line],line}}'
2 cc
2 aa
1 dd
1 bb

或者,perl:

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | 
   perl -lne '$k{$_}++ }{ for $i (sort { $k{$b} <=> $k{$a} } keys %k ){print "$k{$i} $i"}'
2 aa
2 cc
1 bb
1 dd

但这只是重新发明轮子。另外,这两个脚本都会重新加载内存中的所有输入,这在处理大量数据时可能会出现问题。所以只要坚持你正在做的事情就可以了。这是一个很好的解决方案,可能是最有效的解决方案。

相关内容