標準入力で行をグループ化して計算する最良の方法は何ですか?

標準入力で行をグループ化して計算する最良の方法は何ですか?

昔から、... | sort | uniq -c | sort -nr入力の各行に何行があるかを把握するために、入力行をグループ化して計算してきました。

もっと良い方法がありますか?ただ悪い習慣ができましたか? Ubuntu Linux 18.04+(またはすでに存在するものapt-get)にインストールされる標準のUnixツールを使用するより良い方法はありますか?

答え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

またはパール:

$ 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

しかし、これは単に車輪を再発明するだけです。また、両方のスクリプトがメモリ内のすべての入力を再ロードするため、大量のデータを処理する際に問題が発生する可能性があります。だから今やっていることを続けてください。これは素晴らしいソリューションであり、おそらく最も効率的なソリューションです。

関連情報