固有行のリアルタイム数

固有行のリアルタイム数

複数の異なるライン(ストリーム)を連続的に出力するコマンドがあり、各ラインが発生する回数のリアルタイムサマリーが必要です(数秒の遅延は許可されています)。

たとえば、私のコマンドが次のように出力する場合:

apple
apple
apple
apple
banana
orange
banana

私は次のようなものが欲しい:

4 apple
2 banana
1 orange

そして、数秒ごとに出力が更新されるようにしてください。

この目標をどのように達成できますか? (フルログファイルを再度読み込むと時間がかかりすぎます。リアルタイムパイプラインの出力である必要があります。)

ベストアンサー1

awkを使用できます。

... | awk '{seen[$0]++} !(NR % 10) {print "======"; for (i in seen) print seen[i], i}'

これにより、重複項目数(seen[$0]++)が維持され、10行の入力行ごとに印刷されます(!(NR % 10))。たとえば、

% % while sleep 1; do echo $((RANDOM % 10)); done | awk '{seen[$0]++} !(NR % 10) {print "======"; for (i in seen) print seen[i], i}'
======
1 0
1 1
3 3
1 6
2 7
2 9
======
3 0
3 1
1 2
3 3
1 4
2 5
2 6
3 7
2 9
======
3 0
3 1
2 2
3 3
2 4
5 5
4 6
3 7
2 8
3 9
...

おすすめ記事