Fusion de deux fichiers sur une colonne commune et impression de toutes les colonnes à l’aide de awk

J’ai deux très longs fichiers séparés par un espace qui ressemblent à ceci:

fichier1:

CHR SNP A1 A2 MAF 1 rs12 AG 0.43 1 rs1 AT 0.22 1 1:30 GA 0.012 1 rs23 GA 0.012 

fichier2:

 SNP CHR A1 A2 MAF CHR:BP rs21 1 GA 0.03 1:30 rs13 1 TA 0.06 1:122 rs23 1 AG 0.02 1:234 

Je veux les fusionner lorsque la colonne 2 du fichier 1 correspond à la colonne 1 du fichier 2 ou à la colonne 6 du fichier 2 et imprime toutes les colonnes des deux fichiers.

donc ma sortie pour l’exemple devrait être: fichier 3

 SNP CHR A1 A2 MAF CHR:BP CHR SNP A1 A2 MAF rs21 1 GA 0.03 1:30 1 1:30 GA 0.012 rs23 1 AG 0.02 1:234 1 rs23 GA 0.012 

J’ai utilisé le code suivant:

 awk 'NR==FNR{a[$2]=$0;next} ($1 in a || $6 in a){print $0 FS a[$2]}' file1 file2 > file3 

Mais pour une raison quelconque, il filtre les bonnes lignes mais imprime uniquement les colonnes de fichier2 mais pas de fichier1.

J’ai également essayé avec join, mais cela me donne des résultats étranges, même lorsque les fichiers sont sortingés. Sens étrange, cela signifie qu’il représente environ 1/5 des lignes qui sont réellement présentes dans les deux fichiers. Mais juste pour compléter, c’est le code que j’ai essayé d’utiliser join:

 join -1 2 -2 1 -o '2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 1.1 1.2 1.3 1.4 1.5 1.6' <(sort -k2 file1)  file3.1 join -1 2 -2 6 -o '2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 1.1 1.2 1.3 1.4 1.5 1.6' <(sort -k2 file1)  file3.2 cat file3.1 file 3.2 > file3 

Est-ce que quelqu’un voit mon erreur? Je serais très reconnaissant Merci!

Votre erreur est dans votre commande d’ print :

 {print $0 FS a[$2]} 

devrait être

 {print $0, ( $1 in a ? a[$1] : a[$6] )} 

parce que (1) le champ “intéressant” est seulement dans $2 alors que vous êtes dans fichier1, pas pendant que vous traversez file2 , et (2) vous devez extraire des données du tableau en fonction de vos conditions. Nous pouvons sélectionner l’élément de tableau à l’aide d’un opérateur ternaire classique. (J’ai ajouté un espacement supplémentaire pour faciliter la lecture.)

Notez l’utilisation de la virgule, qui sépare les champs par OFS , plutôt que d’utiliser FS qui est votre séparateur de champ d’entrée.

Sinon, votre code me semble bien.

Pourriez-vous s’il vous plaît essayer de suivre.

 awk 'FNR==NR{a[$2]=$0;next} ($1 in a) || ($6 in a){print $0,a[$1]?a[$1]:a[$6]}' Input_file1 Input_file2 

Ajouter une forme de solution non-une doublure ici aussi.

 awk ' FNR==NR{ a[$2]=$0 next } ($1 in a) || ($6 in a){ print $0,a[$1]?a[$1]:a[$6] }' Input_file1 Input_file2 

Ajoutez > file3 à ceux ci-dessus pour obtenir la sortie dans le fichier3.

EDIT: Ajouter une solution pour le code des OP maintenant.

 awk 'NR==FNR{a[$2]=$0;next} ($1 in a || $6 in a){print $0 FS a[$1]?a[$1]:a[$6]}' file1 file2 > file3