Analisando CSV usando AWK ou SED

0

Estou tentando por muitas horas limpar meu arquivo csv usando (AWK ou SED)

aqui está como parece o arquivo csv:

id,name,contact-type,contact
"1","toto corp","tel","+123456789"
"1","toto corp","fax","+198765432"
"1","toto corp","site","totocorp.com"
"2","Namek corp","tel","+14377678563"
"2","Namek corp","fax","+19867334565"
"2","Namek corp","site","Namekcorp.com"

e gostaria de ter esta saída:

id,name,tel,fax,site
"1","toto corp","+123456789","+198765432","totocorp.com"
"2","Namek corp","+14377678563","+19867334565","Namekcorp.com"

Obrigado pela mão pessoal!

    
por Basaa88 06.06.2017 / 00:04

3 respostas

1

Solução

gawk :

awk 'BEGIN{ FS=OFS=","; print "id,name,tel,fax,site" }
     { gsub(/"/,"",$3); a[$1][$3]=$4; if(!a[$1]["name"]) a[$1]["name"]=$2; }
     END { for(i in a) print i,a[i]["name"],a[i]["tel"],a[i]["fax"],a[i]["site"] }' file

A saída:

id,name,tel,fax,site
"1","toto corp","+123456789","+198765432","totocorp.com"
"2","Namek corp","+14377678563","+19867334565","Namekcorp.com"
  • a[$1][$3]=$4 - array multidimensional, usando id field value como chave pai e contact-type field values como chaves da matriz aninhada
por 06.06.2017 / 00:29
1

Supondo que não haja vírgulas dentro de campos csv com aspas duplas, podemos fazer o seguinte em um código sed simples:

sed -ne '
     s/,/&\n/2;s/\n[^,]*,//;h
   n;s/.*,//;H
   n;s/.*,//;H
   g;s/\n/,/gp
' yourfile.csv

Resultados

"1","toto corp","+123456789","+198765432","totocorp.com"
"2","Namek corp","+14377678563","+19867334565","Namekcorp.com"
    
por 06.06.2017 / 00:16
1

Outro gnu awk:

$ awk -F, -v OFS="," 'NR==1{h=$0;next}{a[$1FS$2]=(NR==2?FS $4:a[$1FS$2] FS $4)} \
END{print h;for (k in a) print k a[k]}' file

#Output:    
id,name,contact-type,contact
"2","Namek corp","+14377678563","+19867334565","Namekcorp.com"
"1","toto corp","+123456789","+198765432","totocorp.com"

Devido à maneira como o awk percorre arrays, na seção END o array não é impresso em ordem de classificação.

    
por 06.06.2017 / 01:23