J'utilise beaucoup de tri grek awk dans mon shell Unix pour travailler avec des fichiers texte de colonne de taille moyenne (environ 10 à 100 millions de lignes) séparés par des tabulations. À cet égard, le shell Unix est ma feuille de calcul.
Mais j'ai un gros problème, c'est la sélection des enregistrements en fonction d'une liste d'ID.
Ayant un table.csv
fichier au format id\tfoo\tbar...
et un ids.csv
fichier avec la liste des identifiants, sélectionnez uniquement les enregistrements table.csv
dont l'identifiant est présent dans ids.csv
.
type de /programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-ids mais avec shell, pas perl.
grep -F
produit évidemment des faux positifs si les identifiants sont de largeur variable.
join
est un utilitaire que je ne pourrais jamais comprendre. Tout d'abord, cela nécessite un tri alphabétique (mes fichiers sont généralement triés numériquement), mais même dans ce cas, je ne peux pas le faire fonctionner sans me plaindre d'un ordre incorrect et sans sauter certains enregistrements. Donc je n'aime pas ça. grep -f par rapport au fichier avec ^id\t
-s est très lent lorsque le nombre d'identifiants est élevé.
awk
est encombrant.
Existe-t-il de bonnes solutions pour cela? Des outils spécifiques pour les fichiers séparés par des tabulations? Des fonctionnalités supplémentaires seront également les bienvenues.
UPD: corrigé sort
->join
awk
.
sort
peut faire toutes sortes de tri, numérique, alphabétique et autres. Tu vois man sort
.
grep -f
est trop lente, le maintien de cette stratégie semble plus difficile que cela en vaut la peine - les variations seront probablement la proie des mêmes problèmes de performances O (N * M). Peut-être que votre temps serait mieux consacré à apprendre à utiliser une base de données SQL normalisée ...