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)
。