uniq -c
同じ行の連続発生回数を計算するのに非常に便利です。
$ seq 1 1000 | awk '{ if ($1 > 100 && $1 <= 200) { print "hi" } else {print "bye"} }' | uniq -c
100 bye
100 hi
800 bye
ただし、各固有行の数を取得するには、まず入力をソートする必要がありますが、これはやや非効率的です。
$ seq 1 1000 | awk '{ if ($1 > 100 && $1 <= 200) { print "hi" } else {print "bye"} }' | sort | uniq -c
オンラインアルゴリズムを使用して一意の行のすべての発生を計算する慣用的な方法はありますか?
答え1
最初に入力をソートするのが最も効率的です。
awk one-linerを使用してこれを行うことができます。
awk '{++seen[$0]} END {for (line in count) printf "%7d %s\n", count[line], line}'
メモリとCPU時間の面でどちらがより効率的かは、データと実装によって異なります。sort
理論的には追加のタスクを実行するため効率が悪くなりますが、一方で1つのタスクだけを実行してうまくいきますが、awkは汎用ツールです。重複するエントリが多い場合、awkはメモリを使い果たし、速度が速くなる可能性があります。一方、多くのソート実装はRAMに収まらない巨大なデータセットを処理する可能性があり、awkはクラッシュします。