입력하다:
|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
항상 두 번째 및 세 번째 필드가 아닌 경우(그러나 해당 순서로 발견됨):
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
형식화에 허용되는 출력 필드 구분 기호입니다 ,
.
두 번째 게임은 세 번째 게임과 함께 재구성되었습니다. 다른 모든 내용은 있는 그대로 인쇄됩니다.