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

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

私は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バージョンよりあまり優雅ではないことを認めていますが、少なくともまだ冗談です。

答え2

一意のソートがこれを行うことができます。

$ sort -u input.txt
2019-02-17 not active
2019-02-18 active
2019-02-19 active
2019-02-19 not active
2019-02-20 active
2019-02-21 not active
2019-02-22 not active

ただし、sort input.txt | uniq同じことを行い、一意性を決定するときにフィールドをスキップするオプションと、一意の行ではなく一意ではない行を印刷したい場合のオプションもuniqあります。-f-d-D


または、日付ごとに1つの出力行のみを希望する場合は、「アクティブ」項目が「非アクティブ」(または他の)項目よりも優先されます。

perl -lane '
  $date=shift @F;
  $day{$date} = join(" ",@F) unless ($day{$date} eq "active");
  END {print $_ . " " . $day{$_} for (sort keys %day)}' input.txt
2019-02-17 not active
2019-02-18 active
2019-02-19 active
2019-02-20 active
2019-02-21 not active
2019-02-22 not active

%day日付をキーにし、残りのフィールドを値としてハッシュ()を作成します。特定の日付について、現在または最後に表示された値が以前に表示された値を上書きします。〜しない限り特定の日付の値はすでに「アクティブ」状態です。この場合、今日の値は置き換えられません。

すべての入力を読み取った後、%dayハッシュがソートされて印刷されます。

これは、第2のフィールドのソート順に依存するよりも一般的に有用で再利用可能である。たとえば、「zzzzz」が「action」より優先されるようにしたい場合です。 2番目のフィールドに、「作業」の前に並べ替えられた項目(数字など)を含めることができる場合にも便利です。

関連情報