Questão Grep para filtrar arquivos CSV gigantescos


Estou lidando com um arquivo CSV que contém mais de 2 milhões de linhas. Muito grande.

Eu preciso usar o grep (ou qualquer outra maneira melhor) para recuperar a linha inteira se o valor da segunda coluna corresponder a 'jpn' ou 'por'.

Eu tentei usar grep '<\jpn\>' || grep '<\por\>' file1.csv > file2.csv mas não teve sucesso até agora. A questão principal é que 'por' é uma ocorrência comum na terceira coluna, que gera mais de um milhão de linhas indesejáveis.

Algum usuário mais experiente poderia ser gentil e me dar alguma ajuda?

Desde já, obrigado! : D


4


origem




Respostas:


Em que sistema operacional Linux você está? Tente usar egrep se você quiser usar expressões regulares em sistemas cuja versão do grep está desatualizada (por exemplo, Solaris).

De qualquer forma, aqui está uma solução awk:

awk -F, '$2 ~ /jpn|por/ {print}' file1.csv > file2.csv

Explicações:

  • awk para operações baseadas em coluna
  • -F, para definir o separador de coluna / tokenizer, neste caso eu uso uma vírgula
  • $2 ~ /jpn|por/ testa a coluna # 2 com expressão /jpn|por/
    • $2 é a coluna # 2
    • /jpn|por/ é uma expressão regular para combinar jpn ou por
  • {print} especifica o que o awk deve gerar se encontrar uma linha correspondente
    • print imprimir toda a linha de entrada (alternativamente, print $3 apenas imprimirá a coluna # 3)
  • ... file1.csv especifica ler de um arquivo de entrada em vez de stdin

11



Estou usando o OS X 10.10. - Sua dica funcionou como um encanto! Muito obrigado! ;) - YLeven


grep '; jpn;\|; por;' /path/to/file1.csv > file2.csv

Assumindo que ponto e vírgula (;) é o separador.


1





Não tenho certeza, mas talvez isso funcione:

grep '^[^,]*,\(por\|jpn\)\(,\|$\)' file1.csv > file2.csv

Assumindo que "," é o separador.


0





Isso parece funcionar para mim:

egrep '^.?,(jpn|por),.*$' file1.csv > file2.csv

0