パイプを並べ替えてフィールドを分離し、2つのフィールドを結合します。

パイプを並べ替えてフィールドを分離し、2つのフィールドを結合します。

入力する:

|Ordernum=8921|mn=03|yr=20|id=869|Name=1|Street=2|City=3|State=4|Zip=5|Country=6|

出力:

8921,03/20,869,1,2,3,4,5,6

どうすればいいですか?

答え1

そしてsed

sed 's/|[^=]*=/,/g; s/|$//; s/,//; s|,|/|2'

または、mn合計がyr常に2番目と3番目のフィールドではない場合(ただし、その順序で見つかります):

sed 's@|mn\(=[^|]*\)|yr=@|mnyr\1/@; s/|[^=]*=/,/g; s/|$//; s/,//'

答え2

GNUの使用awk:

awk -F\| '{print gensub(/Ordernum=(.*)/,"\\1","g",$2)","gensub(/mn=(.*)/,"\\1","g",$3)"/"gensub(/yr=(.*)/,"\\1","g",$4)","gensub(/id=(.*)/,"\\1","g",$5)","gensub(/Name=(.*)/,"\\1","g",$6)","gensub(/Street=(.*)/,"\\1","g",$7)","gensub(/City=(.*)/,"\\1","g",$8)","gensub(/State=(.*)/,"\\1","g",$9)","gensub(/Zip=(.*)/,"\\1","g",$10)","gensub(/Country=(.*)/,"\\1","g",$11)}'

答え3

Awk解決策:

awk '{
         for (i = 1; i <= NF; i++)    # iterating through all fields
             if ($i != "") {          # check if field value is not empty
                 c++; sub(/[^=]+=/, "", $i);
                 printf "%s%s", (c > 1? (c == 3? "/" : ",") : ""), $i
             }
             print "" 
     }' FS='|' file

出力:

8921,03/20,869,1,2,3,4,5,6

答え4

awk数値のみを含むフィールドを見つけるには、GNUを使用してください。

awk -v FPAT='[0-9]+' -v OFS=',' '{$2=$2 "/" $3; printf "%s,%s,",$1,$2; for(i=4;i<=NF;i++){ printf "%s%s",$i,i==NF?ORS:OFS}}'  <<< "|Ordernum=8921|mn=03|yr=20|id=869|Name=1|Street=2|City=3|State=4|Zip=5|Country=6|"

FPATパターンの形状を説明します。この場合、数字のみで構成されます。

OFSフォーマットに使用できる出力フィールドの区切り記号,

2番目のゲームは3番目のゲームで再構成されました。他のすべての内容はそのまま印刷されます。

関連情報