awkを使用して角かっこを置き換えますか?

awkを使用して角かっこを置き換えますか?

awkを使用して両方の場合、角括弧をどのように変更できますか?

  1. 空の括弧を「None」という単語に変更します。

    192.168.0.24,上,()

  2. 角かっこを削除すると、host.domain.comだけが残ります。

    192.168.0.25,上記,(host.domain.com)

答え1

sedを使用してください:

echo -e "192.168.0.25,Up,()\n1.2.3.4,Up,(host.domain.com)" | 
    sed 's/()/None/g;s/[()]//g'
192.168.0.25,Up,None
1.2.3.4,Up,host.domain.com

これはawkプログラムです:

BEGIN {FS=","}
$3 ~ /\(\)/   { printf ($1","$2",None\n"); next }
$3 ~ /\(.+\)/ { 
                  gsub ("\\(", "")
                  gsub ("\\)", "")
              }
              { printf ($0"\n") }

呼ぶ

echo -e "1.8.0.5,Up,()\n1.2.3.4,Up,(host.d.com)" | awk -f ip.awk 

例えば。

答え2

これは動作します -

awk -F"," -v OFS="," '
$NF=="()" {print $1,$2,"NONE";next}
{gsub(/\(|\)/,"",$NF);print}' INPUT_FILE

説明する:

  1. フィールド区切り文字をに設定,し、出力フィールド区切り文字をに設定しました,。 OFSを設定すると、必須フィールド区切り文字を明示的に印刷する必要がなくなります。

  2. スキーマ$NF=="()"(ここで$ NFは最後のフィールド)をチェックし、trueの場合は最初と2番目のフィールドを印刷し、NONE最後のフィールドを印刷します。サンプルデータには3つのフィールドしかないので、このアプローチは大丈夫です。ただし、フィールドが5つより多い場合は、単純なフィールドを使用するのがfor loop理想的です。for loopこれが機能していることを確認してくださいi=1;i<NF;i++。最終フィールドを手動で配置できます。また、next2 番目のジョブが最初の行で実行されることを望まないため、次の行に移動というキーワードを使用します。

  3. 2 番目の作業文は、最初の作業文と一致しないすべての行に対して true です。ここでは、何も置き換えないように、グローバル代替組み込み関数を使用しますbrackets

テスト:

[jaypal:~/Temp] cat file
192.168.0.24,Up,()
192.168.0.25,Up,(host.domain.com)
192.168.0.24,Up,()
192.168.0.24,Up,()
192.168.0.25,Up,(host.domain.com)
192.168.0.25,Up,(host.domain.com)

[jaypal:~/Temp] awk -F"," -v OFS="," '
$NF=="()" {print $1,$2,"NONE";next}
{gsub(/\(|\)/,"",$NF);print}' file
192.168.0.24,Up,NONE
192.168.0.25,Up,host.domain.com
192.168.0.24,Up,NONE
192.168.0.24,Up,NONE
192.168.0.25,Up,host.domain.com
192.168.0.25,Up,host.domain.com

関連情報