awkでgsubを使用してすべての文字列に適用する方法

awkでgsubを使用してすべての文字列に適用する方法

gsubすべての文字列に適用するためにwithを試してみましたが、awk失敗しました。

gsub(/^ *| *$/,"", $4);

文字列に適用したくなく、$4すべての文字列に適用したいと思います。試しましたが$0失敗しました。

何が問題なの?

awk '{ 
     split($12, a, /[/:]/); 
     if (length(a[2]) == 1) $12=sprintf("%s:%02d/%d", a[1], a[2], a[3]);
     gsub(/^ *| *$/,"", $0);
     print $9, $12, $10, $2, $3, $4, $5, $6, $7, $8, $13 
 }' FS='|' OFS=',' file

はい

|f_name:x|l_name:x| address:x x | city:x |state:x|zip:x|country:x|ordernumber:x|code:x|downloaded:x| exp:9/2017|ip:x.x.x.x|

出力

ordernumber:x,exp:09/2017,code:x,f_name:x,l_name:x,address:x x,city:x,state:x,zip:x,country:x,ip:x.x.x.x

答え1

フィールド(またはループカウンタの名前を指定するために使用したすべての項目)を繰り返し1参照します。構文はCに似ています。NF$i

for (i = 1 ; i <= NF ; i++) {
    ...
}

例えば

$ echo "  foo bar  :doh : bla:" |awk -vOFS=: -F: '
    { for (i = 1 ; i <= NF ; i++) gsub(/^ +| +$/, "", $i) } 1'
foo bar:doh:bla:

/^ */(asに変更したのは前者を無視する/^ +/ようです。)mawk^

答え2

各フィールド(フィールドが文字 "|"で区切られている)からスペースを削除したい場合は、フィールドを区切り記号に変更してスペースを含めます。 awkがフィールド区切り文字で正規表現をサポートしていると仮定した場合は、FS='|'設定を次のように置き換えます。

FS=' *\\| *'

|文字列は現在パターンなので、エスケープが必要です。

最初のフィールドの先頭と最後のフィールドの終わりにあるスペースは処理されません。これにsub(/^ */,"",$1)およびを使用できますsub(/ *$/,"",$NF)

関連情報