Grep para filtrar o arquivo CSV gigante

4

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 tive 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 indesejadas.

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

Obrigado antecipadamente! : D

    
por YLeven 17.10.2014 / 04:28

4 respostas

11

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 para 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 a expressão /jpn|por/
    • $2 é a coluna # 2
    • /jpn|por/ é uma expressão regular para corresponder a jpn ou por
  • { print } especifica o que o awk deve gerar se encontrar uma linha correspondente
    • print para 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
por 17.10.2014 / 07:05
1

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

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

    
por 17.10.2014 / 05:02
0

Não tenho certeza, mas talvez isso funcione:

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

Assumindo que "," é o separador.

    
por 17.10.2014 / 06:05
0

Isso parece funcionar para mim:

egrep '^.?,(jpn|por),.*$' file1.csv > file2.csv
    
por 17.10.2014 / 08:04

Tags