stdin の行をグループ化してカウントする最適な方法は何ですか?

stdin の行をグループ化してカウントする最適な方法は何ですか?

昔から、私は... | 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

もちろん、代わりに小さなスクリプトを使用して、1 つのコマンドだけを使用することもできます。たとえば、次のようになります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

しかし、それは車輪の再発明に過ぎません。さらに、両方のスクリプトはすべての入力をメモリにロードするため、大量のデータを扱うときに問題になることがあります。したがって、今やっていることをそのまま続けてください。これは優れたソリューションであり、おそらく最も効率的なソリューションです。

関連情報