awk で一致と一致しないものの両方を出力するにはどうすればよいですか?

awk で一致と一致しないものの両方を出力するにはどうすればよいですか?

基本的に、入力がフィルターに一致する場合に出力を変更するだけですが、変更される部分はフィルターされる部分ではありません (そうでない場合は を使用しますsed)。これまでのところ、問題は、 my がawk変更された行のみを出力していることです。

簡単な例として、これを test.txt に記述します。

orange beet pear cowmilk
apple pear berry cowmilk
orange melon cherry cowmilk

次のコードを使用する場合:

awk /orange/'{gsub(/cow/,"cow~"); print}' test.txt

次のような結果になります:

orange beet pear cow~milk
orange melon cherry cow~milk

私がむしろ得たいのは:

orange beet pear cow~milk
apple pear berry cowmilk
orange melon cherry cow~milk

awk を使用できることを確認でき||ましたが、それを上記の gsub に適合させる方法がわかりません。

ボーナスの鑑賞のために、私が本当にやりたいのは、 の代わりに色を追加することですが~、それは完全に壊れています。

awk /orange/'{gsub(/cow/,"cow'\e[1;34m'"); print}' test.txt

\行の終わりではないというエラーが表示されます。

答え1

色については、実際の ESC 文字 (エスケープされた形式ではない\e) を指定する必要があります。値は 16 進数\x1Bまたは 8 進数です\033。次のスクリプトは、ダッシュに色を付け-、すべての入力行を印刷します。

awk '/orange/{gsub(/cowmilk/,"cow\x1B[1;34m-\x1B[0mmilk")} {print}' "$file"

sed '/orange/{s/cowmilk/cow\x1B[1;34m-\x1B[0mmilk/g}' "$file"

答え2

いくつかの行のみを変更した後に各行を印刷するには、( 1) のように常に true と評価される別の条件を追加します。

awk '/orange/{gsub("cow", "cow~")} 1' "$file"

明示的に次のようにすることもできます{print}:

awk '/orange/{gsub("cow", "cow~")} {print}' "$file"

各 awk ステートメントは条件とステートメント句で構成されていることに注意してください。

condition {statements}

ただし、これらはオプションであり、{statements}の場合、{print}が使用されます。condition、その後が1使用されます。

関連情報