Reordenar campos separados por tubulações com junção entre dois campos

1

Entrada:

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

Saída:

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

Como posso conseguir isso?

    
por αԋɱҽԃ αмєяιcαη 04.06.2018 / 10:39

4 respostas

0

Usando o 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)}'
    
por 04.06.2018 / 10:48
1

com sed :

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

Ou se mn e yr não forem sempre os segundo e terceiro campos (mas forem encontrados nessa ordem):

sed 's@|mn\(=[^|]*\)|yr=@|mnyr/@; s/|[^=]*=/,/g; s/|$//; s/,//'
    
por 04.06.2018 / 10:53
0

Awk solução:

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

A saída:

8921,03/20,869,1,2,3,4,5,6
    
por 04.06.2018 / 10:50
0

Usando o GNU awk , procurando campos com apenas números:

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 descreve como o padrão se parece. Neste caso, é composto apenas de números.

OFS é o separador do campo de saída que permite a formatação com , .

O 2º campo é reconstruído com o 3º. Todos os outros são impressos como estão.

    
por 04.06.2018 / 10:49