파이프를 재정렬하여 필드를 분리하고 두 필드를 결합합니다.

파이프를 재정렬하여 필드를 분리하고 두 필드를 결합합니다.

입력하다:

|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형식화에 허용되는 출력 필드 구분 기호입니다 ,.

두 번째 게임은 세 번째 게임과 함께 재구성되었습니다. 다른 모든 내용은 있는 그대로 인쇄됩니다.

관련 정보