web-dev-qa-db-fra.com

awk - compare 2 fichiers et affiche les colonnes des deux fichiers

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.

2
dani_anyman

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
3
steeldriver