Comment comparer deux colonnes de deux fichiers différents et append des colonnes de fichier2 à fichier1 pour plusieurs colonnes consécutives

Relativement nouveau à coder et à utiliser awk, je m’excuse si c’est une question idiote! Je dois comparer $ 3 dans le fichier 1 à $ 3 dans le fichier 2 et, s’ils correspondent, imprimer la ligne du fichier 1 avec l’entrée de ligne correspondante à partir de 10 $ dans le fichier 2. J’ai une commande qui le fait,

awk 'NR==FNR{a[$3]=$10; next} a[$3] {print $0 "\t" a[$3]}' file2 file1

Cependant, file2 contient des colonnes $ 10- $ 647, et je dois faire ci-dessus pour les 637 colonnes. Y a-t-il un moyen de boucler cela?

Exemple de fichier 1:

  1 715348 rs3131984 TG 100 PASS AC=5008;AF=1;AN=5008;NS=2504;DP=16986;EAS_AF=1;AMR_AF=1;AFR_AF=1;EUR_AF=1;SAS_AF=1;AA=.|||;VT=SNP GT 1|1 1|1 1|1 1 723798 rs34882115 CAG C 100 PASS AC=4012;AF=0.801118;AN=5008;NS=2504;DP=24752;EAS_AF=0.7946;AMR_AF=0.8775;AFR_AF=0.5416;EUR_AF=0.9602;SAS_AF=0.9407;VT=INDEL GT 1|1 1|1 1|1 1 723891 rs2977670 GC 100 PASS AC=3906;AF=0.779952;AN=5008;NS=2504;DP=22718;EAS_AF=0.7917;AMR_AF=0.8689;AFR_AF=0.4849;EUR_AF=0.9483;SAS_AF=0.9305;AA=.|||;VT=SNP GT 1|1 1|1 1|1 1 729679 rs4951859 CG 100 PASS AC=3205;AF=0.639976;AN=5008;NS=2504;DP=18762;EAS_AF=0.6875;AMR_AF=0.7536;AFR_AF=0.2905;EUR_AF=0.841;SAS_AF=0.7761;AA=.|||;VT=SNP GT 1|0 1|1 1|0 1 752566 rs3094315 GA 100 PASS AC=3597;AF=0.718251;AN=5008;NS=2504;DP=21293;EAS_AF=0.8839;AMR_AF=0.804;AFR_AF=0.3873;EUR_AF=0.84;SAS_AF=0.8088;AA=.|||;VT=SNP GT 0|1 1|1 0|1 1 752721 rs3131972 AG 100 PASS AC=3272;AF=0.653355;AN=5008;NS=2504;DP=22729;EAS_AF=0.7659;AMR_AF=0.7363;AFR_AF=0.2905;EUR_AF=0.839;SAS_AF=0.7781;AA=.|||;VT=SNP GT 0|1 1|1 0|1 1 754182 rs3131969 AG 100 PASS AC=3398;AF=0.678514;AN=5008;NS=2504;DP=16315;EAS_AF=0.7331;AMR_AF=0.7565;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.|||;VT=SNP GT 0|1 1|1 0|1 1 754192 rs3131968 AG 100 PASS AC=3398;AF=0.678514;AN=5008;NS=2504;DP=16981;EAS_AF=0.7331;AMR_AF=0.7565;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.|||;VT=SNP GT 0|1 1|1 0|1 1 754334 rs3131967 TC 100 PASS AC=3427;AF=0.684305;AN=5008;NS=2504;DP=21917;EAS_AF=0.7629;AMR_AF=0.755;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.|||;VT=SNP GT 0|1 1|1 0|1 1 754503 rs3115859 GA 100 PASS AC=3325;AF=0.663938;AN=5008;NS=2504;DP=19944;EAS_AF=0.7629;AMR_AF=0.7378;AFR_AF=0.3374;EUR_AF=0.839;SAS_AF=0.771;AA=.|||;VT=SNP GT 0|1 1|1 0|1 1 754964 rs3131966 CT 100 PASS AC=3322;AF=0.663339;AN=5008;NS=2504;DP=19476;EAS_AF=0.7629;AMR_AF=0.7378;AFR_AF=0.3366;EUR_AF=0.837;SAS_AF=0.771;AA=.|||;VT=SNP GT 0|1 1|1 0|1 1 755887 rs3131964 CG 100 PASS AC=4905;AF=0.979433;AN=5008;NS=2504;DP=22796;EAS_AF=1;AMR_AF=0.9914;AFR_AF=0.9304;EUR_AF=0.995;SAS_AF=1;AA=.|||;VT=SNP GT 1|1 1|1 1|1 1 755890 rs3115858 AT 100 PASS AC=3763;AF=0.751398;AN=5008;NS=2504;DP=23185;EAS_AF=0.8839;AMR_AF=0.8242;AFR_AF=0.4539;EUR_AF=0.8728;SAS_AF=0.8405;AA=.|||;VT=SNP GT 0|1 1|1 0|1 1 756604 rs3131962 AG 100 PASS AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.|||;VT=SNP GT 0|1 1|1 0|1 

Exemple de fichier 2:

 1 742429 rs3094315 AG . . . GT 0/0 0/0 1 1011278 rs3737728 GA . . . GT 0/0 0/1 1 1077546 rs9442380 CT . . . GT 0/0 0/0 1 1084601 rs4970362 GA . . . GT 0/0 0/1 1 1089205 rs9660710 CA . . . GT 0/0 0/0 1 1300787 rs2765033 CT . . . GT 0/0 0/1 1 756604 rs3131962 AG 100 PASS AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.|||;VT=SNP GT 0|1 1|1 1 1303878 rs2649588 TC . . . GT 0/0 0/1 1 1695996 rs6603811 CT . . . GT 0/0 0/0 1 1782971 rs10907192 GA . . . GT 0/0 0/0 1 1878053 rs3820011 CA . . . GT 0/1 0/1 1 1882185 rs2803291 CT . . . GT 0/0 0/0 

Est-ce que awk est la meilleure façon de faire cela? Je ne sais pas trop comment faire des boucles de quelque sorte que ce soit. Toute aide et explication sont très appréciées!

Je ferais:

 $ column_file1=`awk '{print NF}' file1 | tail -1` $ paste file1 file2 | awk -v c1=column_file1 '{if($3==$(3+c1)){for(i=1;i<=647;i++)if(i<=c1 || i>c1+10){printf "%s ", $i}; printf "\n"}}' 

paste simplement joindre les deux fichiers ligne par ligne.

Le premier if dans awk vérifie si le troisième champ des deux fichiers correspond (considérez que maintenant, le premier champ du second fichier est juste $(1+c1) ). Si la condition est vraie, entrez une boucle qui imprime (sur la même ligne – printf "%s ", $i -) tout le champ en évitant les 10 premiers du second fichier ( if(i<=c1 || i>c1+10) ). Une fois la boucle terminée (vous avez donc imprimé toute la ligne), passez à la nouvelle ligne. Si les fichiers sont bien structurés (chaque champ a la même largeur), vous pouvez utiliser print $0 et colrm la sortie vers colrm .

Si vous préférez utiliser uniquement awk

Copiez ce qui suit dans un fichier

 #!/bin/awk -f {if(NR == FNR) { a[$3] = $10; for(i=11;i<=647;i++){ a[$3] = a[$3] "\t" $i }; next } else{ if($3 in a){print $0 "\t" a[$3]} } } 

puis lancez-le avec

 $ awk -f  file2 file1 

Dis moi si tu as des problèmes

MODIFIER:

J'ai oublié une tail -1 dans le premier exemple. Cela fonctionne avec les exemples que vous avez fournis.

essaye ça –

File1.txt

  #cat file1.txt 1 715348 rs3131984 TG 100 PASS AC=5008;AF=1;AN=5008;NS=2504;DP=16986;EAS_AF=1;AMR_AF=1;AFR_AF=1;EUR_AF=1;SAS_AF=1;AA=.

;VT=SNP GT 1|1 1|1 1|1 1 723798 rs34882115 CAG C 100 PASS AC=4012;AF=0.801118;AN=5008;NS=2504;DP=24752;EAS_AF=0.7946;AMR_AF=0.8775;AFR_AF=0.5416;EUR_AF=0.9602;SAS_AF=0.9407;VT=INDEL GT 1|1 1|1 1|1 1 723891 rs2977670 GC 100 PASS AC=3906;AF=0.779952;AN=5008;NS=2504;DP=22718;EAS_AF=0.7917;AMR_AF=0.8689;AFR_AF=0.4849;EUR_AF=0.9483;SAS_AF=0.9305;AA=.

;VT=SNP GT 1|1 1|1 1|1 1 729679 rs4951859 CG 100 PASS AC=3205;AF=0.639976;AN=5008;NS=2504;DP=18762;EAS_AF=0.6875;AMR_AF=0.7536;AFR_AF=0.2905;EUR_AF=0.841;SAS_AF=0.7761;AA=.

;VT=SNP GT 1|0 1|1 1|0 1 752566 rs3094315 GA 100 PASS AC=3597;AF=0.718251;AN=5008;NS=2504;DP=21293;EAS_AF=0.8839;AMR_AF=0.804;AFR_AF=0.3873;EUR_AF=0.84;SAS_AF=0.8088;AA=.

;VT=SNP GT 0|1 1|1 0|1 1 752721 rs3131972 AG 100 PASS AC=3272;AF=0.653355;AN=5008;NS=2504;DP=22729;EAS_AF=0.7659;AMR_AF=0.7363;AFR_AF=0.2905;EUR_AF=0.839;SAS_AF=0.7781;AA=.

;VT=SNP GT 0|1 1|1 0|1 1 754182 rs3131969 AG 100 PASS AC=3398;AF=0.678514;AN=5008;NS=2504;DP=16315;EAS_AF=0.7331;AMR_AF=0.7565;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.

;VT=SNP GT 0|1 1|1 0|1 1 754192 rs3131968 AG 100 PASS AC=3398;AF=0.678514;AN=5008;NS=2504;DP=16981;EAS_AF=0.7331;AMR_AF=0.7565;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.

;VT=SNP GT 0|1 1|1 0|1 1 754334 rs3131967 TC 100 PASS AC=3427;AF=0.684305;AN=5008;NS=2504;DP=21917;EAS_AF=0.7629;AMR_AF=0.755;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.

;VT=SNP GT 0|1 1|1 0|1 1 754503 rs3115859 GA 100 PASS AC=3325;AF=0.663938;AN=5008;NS=2504;DP=19944;EAS_AF=0.7629;AMR_AF=0.7378;AFR_AF=0.3374;EUR_AF=0.839;SAS_AF=0.771;AA=.

;VT=SNP GT 0|1 1|1 0|1 1 754964 rs3131966 CT 100 PASS AC=3322;AF=0.663339;AN=5008;NS=2504;DP=19476;EAS_AF=0.7629;AMR_AF=0.7378;AFR_AF=0.3366;EUR_AF=0.837;SAS_AF=0.771;AA=.

;VT=SNP GT 0|1 1|1 0|1 1 755887 rs3131964 CG 100 PASS AC=4905;AF=0.979433;AN=5008;NS=2504;DP=22796;EAS_AF=1;AMR_AF=0.9914;AFR_AF=0.9304;EUR_AF=0.995;SAS_AF=1;AA=.

;VT=SNP GT 1|1 1|1 1|1 1 755890 rs3115858 AT 100 PASS AC=3763;AF=0.751398;AN=5008;NS=2504;DP=23185;EAS_AF=0.8839;AMR_AF=0.8242;AFR_AF=0.4539;EUR_AF=0.8728;SAS_AF=0.8405;AA=.

;VT=SNP GT 0|1 1|1 0|1 1 756604 rs3131962 AG 100 PASS AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.

;VT=SNP GT 0|1 1|1 0|1

fichier2.txt

 #cat file2.txt 1 742429 rs3094315 AG . . . GT 0/0 0/0 1 1011278 rs3737728 GA . . . GT 0/0 0/1 1 1077546 rs9442380 CT . . . GT 0/0 0/0 1 1084601 rs4970362 GA . . . GT 0/0 0/1 1 1089205 rs9660710 CA . . . GT 0/0 0/0 1 1300787 rs2765033 CT . . . GT 0/0 0/1 1 756604 rs3131962 AG 100 PASS AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.

;VT=SNP GT 0|1 1|1 1 1303878 rs2649588 TC . . . GT 0/0 0/1 1 1695996 rs6603811 CT . . . GT 0/0 0/0 1 1782971 rs10907192 GA . . . GT 0/0 0/0 1 1878053 rs3820011 CA . . . GT 0/1 0/1 1 1882185 rs2803291 CT . . . GT 0/0 0/0

Rejoindre –

 #awk 'NR==FNR {val[$3]=$10;next;} $3 in val {print $0,val[$3]}' file2.txt file1.txt 1 752566 rs3094315 GA 100 PASS AC=3597;AF=0.718251;AN=5008;NS=2504;DP=21293;EAS_AF=0.8839;AMR_AF=0.804;AFR_AF=0.3873;EUR_AF=0.84;SAS_AF=0.8088;AA=.

;VT=SNP GT 0|1 1|1 0|1 0/0 1 756604 rs3131962 AG 100 PASS AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.

;VT=SNP GT 0|1 1|1 0|1 0|1