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