重複したアイテムを削除し、後ろに特定の単語があるアイテムのみを保持します。

重複したアイテムを削除し、後ろに特定の単語があるアイテムのみを保持します。

私はbashスクリプトに最初に触れました、そして私は現在のスクリプトにいくつかのコードを変更したいと思います。

次のように、日付と日付の後に「アクティブ」または「非アクティブ」という単語を含むファイルがあります。

2019-02-17 not active
2019-02-18 active
2019-02-19 not active
2019-02-19 not active
2019-02-19 active
2019-02-19 not active
2019-02-19 not active
2019-02-19 active
2019-02-20 active
2019-02-21 not active
2019-02-22 not active

「2019-02-19アクティブ」のコピーを維持しながら、「2019-02-19非アクティブ」のすべての重複を削除したいと思います。ご意見ありがとうございました。ありがとうございます!

ベストアンサー1

GNUを使用すると、uniq次のことができます。

 sort file | uniq -w 10

オプションは-w比較を10文字に制限するため、各日付は一度だけ保持されます。並べ替えると、active最初の項目が表示され、後ろに残ります。

たとえば、この質問の将来の読者がGNUを持たないシステムを使用するようになる場合をuniq使用できます。sed重複行を削除する一般的な方法は次のとおりです。

sed '$!N;/^\(.*\)\n\1$/!P;D'

このN;P;Dパターンはパターン空間に常に2行を保持しますが、2行目が異なる場合は1行目だけが印刷されます。日付部分の重複項目のみを確認するようにこのスクリプトを変更できます。

sed '$!N;/^\([^ ]*\) .*\n\1/!P;D'

active次の行を選択するように注意してください。

sed '$!N;/^\([^ ]*\) .*\n\1/!P;//s/\(.*\)\(\n\).*not.*/\2\1/;D'

最初の部分は同じままです。日付が変更された後の行(または最後の行)のみを印刷します。ただし、日付が同じ場合(アドレスの空のパターンは前のパターンの//繰り返しを意味します)、通常2番目の行が保持されます。ただし、2行not目が含まれている場合は最初の行(activeまたは)を保持する方が良いnot activeため、このsコマンドは最初の行を2行目にします(とにかく削除される空行の後D)。

私はこれがGNUバージョンよりあまり優雅ではないことを認めていますが、少なくともまだ冗談です。

おすすめ記事