7
votes

Joindre 3 fichiers par première colonne avec Join (était awk)?

J'ai trois fichiers similaires, ils sont tous comme ceci:

fichier A xxx

et je veux une sortie comme celle-ci

xxx

à la recherche de la première ligne, je veux que la valeur1a soit la valeur de l'ID1 dans Filea, valeur1b de la valeur de l'ID1 dans FileB, etc., que chaque champ et chaque ligne . Je suis comme une jointure SQL. J'ai essayé plusieurs choses mais aucune d'entre elles où voire proche.

Edit: Tous les fichiers ont la même longueur et ID.


1 commentaires

Eh bien, en fait non, mais quelqu'un m'a dit que c'était le meilleur outil de faire ce genre de choses. J'ai aussi essayé avec couper, mais je ne pouvais pas voir le chemin.


4 Réponses :


10
votes

donne Joindre (1) A essayer:

join fileA fileB | join - fileC


4 commentaires

Si seulement je savais que cela existait, je n'aurais pas perdu 10 minutes à regarder la syntaxe Awk ;-)


Soyez juste prudent - cela n'inclut pas de lignes qui ne sont pas dans tous des fichiers joints. Si vous êtes sûr que toutes les clés existent dans tous les fichiers, c'est bien.


Je vais mentionner dans la question que chaque fichier a la même longueur et les mêmes identifiants.


Pas de problèmes, @Noinflection. Je laisserai ma réponse pour le cas plus général mais Dennis 'est vraiment meilleur (c'est-à-dire plus petit et plus rapide) pour vos exigences modifiées.



2
votes

mise à jour: La question a été modifiée pour indiquer que tous les fichiers contiennent toutes les clés, de sorte que la réponse acceptée ( rejoindre ) est définitivement meilleure que celle-ci. Seulement envisagez d'utiliser celui-ci s'il est possible que les touches ne soient pas dans tous les fichiers.


Si vous n'êtes pas aussi préoccupé par la performance, vous pouvez essayer le rapide et sale: xxx

ceci fonctionne d'abord les clés d'abord, puis obtient les valeurs de chaque fichier avec cette touche ou - si ce n'est pas dans le fichier correspondant.

Les commandes grep doivent être ajustées si le fichier est plus complexe (si le champ 1 n'est pas au début de la ligne ou est suivi d'un séparateur sans espace) Mais cela devrait être une solution raisonnable de première coupe. Le grep à utiliser dans ce cas serait le suivant: xxx

x est en fait l'onglet < / kbd> caractère, car cela permet d'atteindre des espaces ou des onglets zéro ou plus avant la touche et un espace ou une onglet pour terminer la clé.

Si les fichiers sont particulièrement importants, vous voudrez peut-être examiner Utilisation des tableaux associatifs dans Awk mais, car il n'y a aucune indication de la taille, je commencerais avec celui-ci jusqu'à ce que vous arriviez au point où il fonctionne trop lentement.


0 commentaires

2
votes

rejoindre code> (la réponse de Dennis) est meilleur, mais juste pour des coups de pied, voici ce que j'ai proposé dans awk code>:

awk '{a=$0; getline b <"fileB"; getline c <"fileC"; $0=a" "b" "c; print $1,$2,$4,$6}' <fileA


0 commentaires

1
votes

Juste pour ajouter que pour rejoindre pour travailler pour travailler, l'entrée doit être triée. Cette solution AWK devrait gérer n'importe quel nombre de fichiers d'entrée. Vous perdrez également l'ordre original des clés (vous aurez besoin de plus de code pour la préserver). XXX


1 commentaires

Merci beaucoup! tard mais sûr!