J'ai posté quelque chose de similaire il y a quelque temps et je pensais que le code fourni pourrait aider à résoudre mon problème, mais malheureusement, je ne suis pas en mesure de l'adapter à mes besoins: awk - compare les fichiers et imprime les lignes des deux fichiers =
Donc, j'ai à nouveau 2 fichiers séparés par des tabulations.
fichier_1.txt
Apple 2.5 5 7.2
great 3.8 10 3.6
see 7.6 3 4.9
tree 5.4 11 5
back 8.9 2 2.1
fichier_2.txt
Apple :::N
back :::ADJ
back :::N
around :::ADV
great :::ADJ
bee :::N
see :::V
tree :::N
La sortie devrait ressembler à:
Apple :::N 2.5 5 7.2
great :::ADJ 3.8 10 3.6
back :::ADJ 8.9 2 2.1
back :::N 8.9 2 2.1
see :::V 7.6 3 4.9
tree :::N 5.4 11 5
La différence par rapport à l’autre article est que j’aime bien comparer les premières colonnes de fichier_1.txt et fichier_2.txt, puis imprimer la totalité de la ligne de fichier_1.txt avec la colonne 2 de fichier_1.txt dans le fichier de sortie. Peu m'importe dans quel ordre $ 2 de fichier_2.txt est imprimé dans le fichier de sortie, de sorte que le fichier de sortie pourrait aussi bien ressembler à
back 8.9 2 2.1 :::N
back 8.9 2 2.1 :::V etc.
Le problème réside dans les doublons de la colonne 1, comme ici. Sinon, je pourrais bien sûr simplement utiliser paste
. Le problème avec cette commande `awk est qu’elle ne lit pas column2 dans le tableau et que si je lui dis de l’imprimer, ce n’est bien entendu pas possible.
awk 'NR==FNR {a[$1]; next} $1 in a {print $0, a[$2]}' OFS='\t' file_2.txt file_1.txt > outfile.txt
J'apprécie volontiers toute aide! Désolé pour la stupidité ici aussi, semble que je suis complètement stupéfait.
Si vous avez GNU awk
(disponible dans le référentiel via le paquet gawk
), qui supporte les tableaux multidimensionnels, vous pouvez le faire
gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt
Ex.
$ gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt
Apple 2.5 5 7.2 :::N
great 3.8 10 3.6 :::ADJ
see 7.6 3 4.9 :::V
tree 5.4 11 5 :::N
back 8.9 2 2.1 :::ADJ
back 8.9 2 2.1 :::N
Sinon, si l'ordre de sortie n'est pas important, la solution la plus simple consiste probablement à utiliser la commande join
:
$ join -t $'\t' <(sort file_1.txt) <(sort file_2.txt)
Apple 2.5 5 7.2 :::N
back 8.9 2 2.1 :::ADJ
back 8.9 2 2.1 :::N
great 3.8 10 3.6 :::ADJ
see 7.6 3 4.9 :::V
tree 5.4 11 5 :::N