連続した重複行をフィルタリングするには、uniqを使用します。
while (true) do echo 1; echo 2; echo 2; echo 1; sleep 1; done | uniq
になる:
1
2
1
繰り返し回数を追加しながら繰り返し連続行を削除する方法はありますか?たとえば、上記の例では
1
2 (2)
1
新しい「1」行が到着すると、上記の内容は次のようになります。
1
2 (2)
1 (2)
これはファイル用ではなく、新しい行がリアルタイムで追加されるストリーム(たとえば、tail -f)用です。
答え1
重複項目を削除する代わりに数を数えます。
awk '{ if (h[$0]++) { s=" (" h[$0] ")" } else { s="" }; printf "%s%s\n", $0, s }'
この配列はh[]
入力を追跡します(現在の行は$0
)。値が 1 より大きい場合、現在の行と一緒に印刷されます。
一意の行セットはメモリに保存されるため、重複行が比較的少ない大規模なデータセットがある場合、ほとんどのデータセットはRAM(またはせいぜいスワップ)に保持されます。ソリューションを構築するときは、この点に注意してください。
1
入力ライン、、、2
の場合、次のような出力が得られます。2
1
3
1
2
2 (2)
1 (2)
3
入力ストリームが有限の場合(例や提案ではないtail -f
)、すべての値を収集してその値と数を出力できます。しかし、そうではないので、私たちはそうすることはできません。