変更してパイプラインで区切られたフィールドを並べ替えます。

変更してパイプラインで区切られたフィールドを並べ替えます。

次の形式の約8k行のLinuxテキストファイルがあります。

|f_name:x|l_name:x|address:x x|city:x|state:x|zip:x|country:x|ordernumber:x|code:x|downloaded:x|exp:09/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

ノート

テキストの一部のデータに対応するフィールドに問題があります。|address:x x|

これは、末尾の前にスペースがあることを意味します|address:x x |。出力から1つ以上のスペースを削除したいです。space|

そしてそのフィールドのデータに問題があります|exp:09/2017|。表示されるデータは次のとおりです。月が単一の数値の場合は、出力に表示されるように追加したいと|exp:9/2017|思います。009/2017

年は異なる場合があります。

例:

|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

牛に似た一種の栄養awk解決策:

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

出力:

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

おすすめ記事