Awk, impression de certaines colonnes en fonction de la correspondance des lignes de fichiers différents

Je suis quasiment certain que je devrais utiliser un fichier contenant les informations dont j’ai besoin et un autre fichier dans lequel je dois extraire deux informations et obtenir deux numéros du deuxième fichier en fonction de cette information. Donc, si le premier fichier a m7 dans sa cinquième colonne et 3 dans sa troisième colonne, je veux rechercher dans la deuxième colonne une ligne comportant 3 dans sa première colonne et m7 dans sa quasortingème colonne. Le Je veux imprimer certaines colonnes de ces fichiers comme indiqué ci-dessous.

Étant donné les deux fichiers suivants de fichier d’entrée1

1 dog 3 8 m7 n15 50 cat 5 8 m15 m22 20 fish 6 3 n12 m7 

fichier2

 3 695 842 m7 word 5 847 881 m15 not 8 910 920 n15 important 8 695 842 m22 word 6 312 430 n12 not 

Je veux produire la sortie

 pre3 695 842 21 pre5 847 881 50 pre6 312 430 20 pre8 910 920 1 pre8 695 842 50 

MODIFIER:

J’ai aussi besoin de produire une sortie du formulaire

 pre3 695 842 pre8 910 920 1 pre5 847 881 pre8 695 842 50 pre6 312 430 pre3 695 842 20 

La réponse ci-dessous fonctionne pour la question précédente, mais je suis confus avec certaines de ses syntaxes, donc je ne sais pas comment l’ajuster pour que cette sortie

Cette commande:

 awk 'NR==FNR{ar[$5,$3]=$1+ar[$5,$3]; ar[$6,$4]=$1+ar[$6,$4]} NR>FNR && ar[$4,$1] {print "pre"$1,$2,$3,ar[$4,$1]}' file1 file2 

les sorties plus le contenu des première, deuxième et troisième colonnes du deuxième fichier et la première colonne du premier fichier pour toutes les lignes dans lesquelles le contenu des cinquième et troisième (ou sixième et quasortingème) colonnes du premier fichier est identique au quasortingème et première colonne:

 pre3 695 842 21 pre5 847 881 50 pre8 910 920 1 pre8 695 842 50 pre6 312 430 20 

(pour les lignes avec plus d’une correspondance, les valeurs de ar [$ 4, $ 1] sont additionnées)

Notez que la sortie n’est pas nécessairement sortingée! Pour y parvenir: ajoutez un sort :

 awk 'NR==FNR{ar[$5,$3]=$1+ar[$5,$3]; ar[$6,$4]=$1+ar[$6,$4]} NR>FNR && ar[$4,$1]{print "pre"$1,$2,$3,ar[$4,$1]}' file1 file2 | sort 

Qu’est-ce que le code?

  • NR==FNR{...} fonctionne que sur le premier fichier d’entrée
  • NR>FNR{...} fonctionne sur le 2ème, 3ème, … fichier d’entrée
  • ar[$5,$3] crée un tableau dont la clé est le contenu de la 5ème et de la 3ème colonne de la ligne / de l’enregistrement en cours (séparés par le séparateur de champs, généralement un blanc)

Vous pouvez utiliser la commande ci-dessous:

 awk 'NR==FNR {a[$3 FS $5]=1;next } a[$1 FS $4]' f1.txt f2.txt 

Si vous souhaitez imprimer uniquement les champs spécifiques des lignes correspondantes du deuxième fichier, utilisez comme ci-dessous:

 awk 'NR==FNR {a[$3 FS $5]=1;next } a[$1 FS $4] { print "pre"$1" "$2" "$3}' f1.txt f2.txt