como concatenar colunas com várias linhas usando o awk

0

eu tenho csv como abaixo

col1,col2,col3,col4,col5

1,val1,57,val1,TRUE
,val2,,val2,    
,val3,,val3,    
,val4,,val4,    
,val5,,val5,    
2,val1,878,val1,FALSE
,val2,,val2,    
,val3,,val3,    
,val4,,val4,    
,val5,,val5,

eu preciso mostrar a saída usando awk como abaixo

col1,col2,col3,col4,col5

1,val1#val2#val3#val4#val5,57,val1#val2#val3#val4#val5,TRUE
2,val1#val2#val3#val4#val5,878,val1#val2#val3#val4#val5,FALSE
    
por mohamed refaat 04.11.2017 / 13:29

2 respostas

0

Solução awk complexa para qualquer número de campos:

awk 'function pr(a, len){    # print an integral(joined) line
         for (i=1; i<=len; i++) printf "%s%s",a[i],(i==len? ORS : ",") 
     }
     NR<3;{ f=($0~/^[0-9]+,/? 1:0) }  # 'f' flag, points to a 'basic' line(starting with digit)
     NR>2{ 
         if (f && a[1]){ pr(a, len) } 
         len=(f? split($0,a,",") : split($0,b,","));  # split into different arrays
         if (!f) {                                    # encountering subsequent line
             for(i=2; i<=len; i++) 
                 if(b[i]!="") a[i]=a[i]"#"b[i]        # append subsequent values to 'basic' line
         } 
     }END{ pr(a, len) }' file

A saída:

col1,col2,col3,col4,col5

1,val1#val2#val3#val4#val5,57,val1#val2#val3#val4#val5,TRUE
2,val1#val2#val3#val4#val5,878,val1#val2#val3#val4#val5,FALSE
    
por 04.11.2017 / 16:47
2

Mantendo-o simples, legível e portátil (principalmente uma função de não ter tanto awk de experiência, hehe):

BEGIN { FS=","; OFS="," }

NR < 3 { 
    print  # just echo header and separator lines
}

/^[0-9]/ { 
    if (NR > 3) {
        # concatenate all parts (note: csv because of OFS not the commas here)
        print part1,part2,part3
    }

    part1=$1 "," $2
    part2=$3 "," $2
    part3=$5
}

/^,/ {
    part1=part1 "#" $2
    part2=part2 "#" $2
}

END { print part1,part2,part3 }

Resultado:

col1,col2,col3,col4,col5

1,val1#val2#val3#val4#val5,57,val1#val2#val3#val4#val5,TRUE
2,val1#val2#val3#val4#val5,878,val1#val2#val3#val4#val5,FALSE
    
por 04.11.2017 / 14:31