![awkとsedは関連する各行の行末を追加します](https://rvso.com/image/1592566/awk%E3%81%A8sed%E3%81%AF%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E5%90%84%E8%A1%8C%E3%81%AE%E8%A1%8C%E6%9C%AB%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%99.png)
行操作をしたいのですが、行ごとの処理に行き詰まっています。ファイルは次のようになります。
10.10.10.10 ABtest
10.10.10.11 ABprod
行末の文字列に応じて各行に文字列を追加したい。
ABtest
私のアプローチは、awk を使用して行末の文字列をテストし、次に sed を使用しABtest
て からに変換することですtest
。その後、関連する各行に出力を追加します。
次のように出力します。
10.10.10.10 ABtest test
10.10.10.11 ABprod prod
答え1
両方必要ではなく、sed
1awk
つのツールで済みます。 で目標を達成するコードはawk
次のようになります。
awk '
/AB/ {
printf $0
gsub("^AB", "", $2)
printf " %s\n", $2
}
' <<EOT
10.10.10.10 ABtest
10.10.10.11 ABprod
EOT
/<expression>/
正規表現を検索し、その{<code>}
部分は awk にそのレコードの処理方法を指示します。この特定のケースでは、関数はgsub
2 番目の列に出現する 'AB' をすべて置き換えます (最初の出現のみを置き換えたい場合は を使用しますsub()
が、正規表現に関しては、どちらを使用しても同じ結果になると思います)。その後、結果が印刷されます。
質問では、変更せずに印刷するために編集する行があるかどうかが明確ではありません。その場合は、次のように一致させて編集した後、次のレコードにジャンプする必要があります。
awk '
/AB/ { printf $0; gsub("^AB", "", $2); printf " $2\n"; next; }
{ print $0 }
' <<EOT
10.10.10.10 ABtest
10.10.10.11 ABprod
testtesttets
EOT
を使ってさらに具体的なテストを作成するといいかもしれませんif
。awk のリソースを調べることを強くお勧めします (ここまたはここ例えば)