CSV - Mantém apenas algumas entradas

2

Eu tenho um monte de dados dentro de "" e separados por , - Exemplo abaixo de duas linhas

"stampthisandthat.com","GANDI SAS","[email protected]","whois.gandi.net","A.DNS.GANDI.NET|B.DNS.GANDI.NET|C.DNS.GANDI.NET|","16-feb-2012","28-feb-2013","16-feb-2014","2012-02-16 00:00:00 UTC","2013-02-28 00:00:00 UTC","2014-02-16 00:00:00 UTC","clientTransferProhibited","2013-11-12 08:00:00 UTC","[email protected]","Laura VOGT","","Gandi, 63-65 boulevard Massena","","","","(Gandi) Paris","","(Gandi) 75013","(Gandi) FR","33143730576","","33170377666","","[email protected]","Laura VOGT","","Gandi, 63-65 boulevard Massena","","","","(Gandi) Paris","","(Gandi) 75013","(Gandi) FR","33143730576","","33170377666",""|
"salochinbd.com","FASTDOMAIN, INC.","[email protected]","whois.fastdomain.com","NS1.IPAGE.COM|NS2.IPAGE.COM|","17-feb-2012","03-feb-2013","17-feb-2014","2012-02-17 00:00:00 UTC","2013-02-03 00:00:00 UTC","2014-02-17 00:00:00 UTC","ok","2013-11-12 08:00:00 UTC","[email protected]","","","","","","","Cedar Rapids","Iowa","52402","UNITED STATES","","","13192100679","","[email protected]","","","","","","","Cedar Rapids","Iowa","52402","UNITED STATES","","","13192100679",""|

Como eu faria para manter apenas determinados dados? Por exemplo, como posso manter apenas os dados dentro do primeiro, segundo e quinto "" .

    
por Teddy291 16.07.2015 / 21:53

4 respostas

3
cut -d\" -f2,4,10 <in | tr \" , >out

... pegaria apenas os bits citados para os campos 1,2 e 5 e depois garantiria que fossem separados com vírgulas.

Ou, como parece, algumas vírgulas podem ocorrer entre aspas ...

 cut -d\" -f-5,10-11 <in | sed s/,$// >out

... ou até mesmo ...

cut -d\" -f-5,10 <in | paste -d\" - /dev/null >out

... pode definir isso como direitos.

As primeiras impressões:

stampthisandthat.com,GANDI SAS,A.DNS.GANDI.NET|B.DNS.GANDI.NET|C.DNS.GANDI.NET|
salochinbd.com,FASTDOMAIN, INC.,NS1.IPAGE.COM|NS2.IPAGE.COM|

... e o segundo, terceiro ...

"stampthisandthat.com","GANDI SAS","A.DNS.GANDI.NET|B.DNS.GANDI.NET|C.DNS.GANDI.NET|"
"salochinbd.com","FASTDOMAIN, INC.","NS1.IPAGE.COM|NS2.IPAGE.COM|"

Aqui está um exemplo demonstrando como fazer semelhante para os campos 1,3,17,21,22,23,24:

printf '"%s"\n' "$(seq -s\",\" 35)" |
cut -d\" -f-3,6-7,34-35,42-48       |
paste -d\" - /dev/null
"1","3","17","21","22","23","24"

... que extrai apenas esses campos de uma saída seq semelhante a:

"1","2","3",..."35"
    
por 16.07.2015 / 21:57
2

Existe um programa pouco conhecido chamado csvquote que torna possível usar ferramentas padrão como cut , sed , e awk para lidar com arquivos CSV. Ele funciona mapeando caracteres especiais entre aspas para alguns caracteres não imprimíveis e, em seguida, mapeando-os de volta. Com este programa, é tão simples como isto:

csvquote file.csv | cut -d , -f 1,2,5 | csvquote -u

Saída:

"stampthisandthat.com","GANDI SAS","A.DNS.GANDI.NET|B.DNS.GANDI.NET|C.DNS.GANDI.NET|"
"salochinbd.com","FASTDOMAIN, INC.","NS1.IPAGE.COM|NS2.IPAGE.COM|"
    
por 17.07.2015 / 06:50
1

awk -F',' '{print $1 $2 $5}' - É isso que você está procurando?

    
por 16.07.2015 / 21:56
0

Para contornar seu problema com vírgulas incluídas nos campos, altere seu separador de campo para quote + comma ; assumindo que suas vírgulas incluídas nos campos não estão no início e / ou no final do campo.

$ awk -F'(\",)' '{print $1 $2 $17}' test.txt

Apenas certifique-se de escapar da cotação e do separador de campo surround entre aspas simples para proteger do seu shell.

NOTA Isso está no Fedora 20 usando gawk , eu acredito.

    
por 17.07.2015 / 14:35