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.csvfichier au format id\tfoo\tbar...et un ids.csvfichier avec la liste des identifiants, sélectionnez uniquement les enregistrements table.csvdont 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 -Fproduit évidemment des faux positifs si les identifiants sont de largeur variable.
joinest 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é.
awkest 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.
sortpeut faire toutes sortes de tri, numérique, alphabétique et autres. Tu vois man sort.
grep -fest 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 ...