Single csv do filtro de leitura com base nos valores da primeira coluna

0

Eu tenho um arquivo csv gigante que tem cerca de GB em tamanho. A primeira coluna do csv contém cerca de 300 valores inteiros únicos. Eu quero processar o csv uma vez e salvar a saída para arquivos diferentes com base no valor da primeira coluna correspondente.

Eu sei que awk solution salva a saída para valores específicos da coluna 1.

for i in $column1values; do
  awk -F, -v a=$i '$1 == a' input.csv > output-$i.csv
done

Mas esta solução irá reler o grande arquivo csv toda vez que quiser encontrar o valor correspondente da coluna 1. Isso é ineficiente, considerando grande arquivo csv.

Então, como posso conseguir isso ao ler o arquivo csv apenas uma vez?

EDITAR:
Digamos que meu arquivo csv original tenha dados ..

1,r1c2,r1c3,r1c4
1,r2c2,r2c3,r2c4
2,r3c2,r3c3,r3c4
2,r4c2,r4c3,r4c4
3,r5c2,r5c3,r5c4
3,r6c2,r6c3,r6c4

E eu quero filtrar a saída com base nos valores da primeira coluna, como ..

output-1.csv:

1,r1c2,r1c3,r1c4
1,r2c2,r2c3,r2c4

output-2.csv

2,r3c2,r3c3,r3c4
2,r4c2,r4c3,r4c4

output-3.csv

3,r5c2,r5c3,r5c4
3,r6c2,r6c3,r6c4

Mais importante, quero filtrar a saída dessa maneira enquanto lemos o arquivo csv grande original apenas uma vez. Como fazer isso?

    
por Bharat G 23.10.2015 / 13:43

1 resposta

3

com awk :

awk -F, '{f="output-"$1".csv"; print $0 >> f; close(f)}' file
  • -F, define o delimitador como , .
  • f="output-"$1".csv" define o nome do arquivo para gravar em
  • print $0 >> f acrescenta a linha ao arquivo f .
  • close(f) fecha o arquivo, porque pode haver muitos arquivos abertos (graças ao comentário de @ Costas )
por 23.10.2015 / 13:55