awkを使用して両方の場合、角括弧をどのように変更できますか?
空の括弧を「None」という単語に変更します。
192.168.0.24,上,()
角かっこを削除すると、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
説明する:
フィールド区切り文字をに設定
,
し、出力フィールド区切り文字をに設定しました,
。 OFSを設定すると、必須フィールド区切り文字を明示的に印刷する必要がなくなります。スキーマ
$NF=="()"
(ここで$ NFは最後のフィールド)をチェックし、trueの場合は最初と2番目のフィールドを印刷し、NONE
最後のフィールドを印刷します。サンプルデータには3つのフィールドしかないので、このアプローチは大丈夫です。ただし、フィールドが5つより多い場合は、単純なフィールドを使用するのがfor loop
理想的です。for loop
これが機能していることを確認してくださいi=1;i<NF;i++
。最終フィールドを手動で配置できます。また、next
2 番目のジョブが最初の行で実行されることを望まないため、次の行に移動というキーワードを使用します。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