Question Grep pour filtrer un fichier CSV gigantesque


Je traite avec un fichier CSV qui contient plus de 2 millions de lignes. Assez grand.

Je dois utiliser grep (ou toute autre méthode) pour récupérer la ligne entière si la valeur de la deuxième colonne correspond à «jpn» ou à «por».

J'ai essayé d'utiliser grep '<\jpn\>' || grep '<\por\>' file1.csv > file2.csv mais n'a pas eu de succès jusqu'à présent. Le problème majeur étant que «por» est une occurrence courante dans la troisième colonne, qui génère plus d'un million de lignes non désirées.

Un utilisateur plus expérimenté serait-il plus gentil et pourrait-il m'aider?

Merci d'avance! :RÉ


4
2017-10-17 02:28


origine




Réponses:


Sur quel système d'exploitation Linux êtes-vous? Essayez d'utiliser egrep si vous souhaitez utiliser des expressions régulières dans des systèmes dont la version de grep est obsolète (par exemple, Solaris).

En tout cas, voici une solution awk:

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

Explications:

  • awk pour les opérations basées sur des colonnes
  • -F, pour définir le séparateur de colonne / tokenizer, dans ce cas j'utilise une virgule
  • $2 ~ /jpn|por/ teste la colonne n ° 2 avec l'expression /jpn|por/
    • $2 est la colonne 2
    • /jpn|por/ est une expression régulière correspondant à jpn ou por
  • {print} spécifie ce que le awk devrait sortir s'il a trouvé une ligne correspondante
    • print pour imprimer toute la ligne de saisie (alternativement, print $3 imprimera simplement la colonne # 3)
  • ... file1.csv spécifie de lire à partir d'un fichier d'entrée au lieu de stdin

11
2017-10-17 05:05



J'utilise OS X 10.10. - Votre astuce a fonctionné comme un charme! Merci beaucoup! ;) - YLeven


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

En supposant que le point-virgule (;) est le séparateur.


1
2017-10-17 03:02





Je ne suis pas sûr, mais peut-être que cela pourrait fonctionner:

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

En supposant que "," est le séparateur.


0
2017-10-17 04:05





Cela semble fonctionner pour moi:

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

0
2017-10-17 06:04