入力する:
|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番目のゲームで再構成されました。他のすべての内容はそのまま印刷されます。