J'ai deux fichiers séparés par des tabulations qui se présentent comme suit:
fichier1:
NC_008146.1 WP_011558474.1 1155234 1156286 44173
NC_008146.1 WP_011558475.1 1156298 1156807 12
NC_008146.1 WP_011558476.1 1156804 1157820 -3
NC_008705.1 WP_011558474.1 1159543 1160595 42748
NC_008705.1 WP_011558475.1 1160607 1161116 12
NC_008705.1 WP_011558476.1 1161113 1162129 -3
NC_009077.1 WP_011559727.1 2481079 2481633 8
NC_009077.1 WP_011854835.1 1163068 1164120 42559
NC_009077.1 WP_011854836.1 1164127 1164636 7
fichier2:
NC_008146.1 GCF_000014165.1_ASM1416v1_protein.faa
NC_008705.1 GCF_000015405.1_ASM1540v1_protein.faa
NC_009077.1 GCF_000016005.1_ASM1600v1_protein.faa
Je veux faire correspondre la colonne 1 du fichier1 au fichier2 et me remplacer par l'entrée respective de la colonne 2 du fichier 2. La sortie ressemblerait à ceci:
GCF_000014165.1_ASM1416v1_protein.faa WP_011558474.1 1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa WP_011558475.1 1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa WP_011558476.1 1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa WP_011558474.1 1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa WP_011558475.1 1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa WP_011558476.1 1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa WP_011559727.1 2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa WP_011854835.1 1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa WP_011854836.1 1164127 1164636 7
Réponses:
Vous pouvez le faire très facilement avec
awk
:Ou, puisque cela ressemble à un fichier séparé par des tabulations:
Cela suppose que chaque ID RefSeq (
NC_*
)file1
possède une entrée correspondante dansfile2
.Explication
NR==FNR
: NR est le numéro de ligne actuel, FNR est le numéro de ligne du fichier actuel. Les deux ne seront identiques que pendant lafile2
lecture du 1er fichier (ici ).a[$1]=$2; next
: s'il s'agit du premier fichier (voir ci-dessus), enregistrez le 2ème champ dans un tableau dont la clé est le 1er champ. Ensuite, passez à lanext
ligne. Cela garantit que le bloc suivant n'est pas exécuté pour le 1er fichier.{$1=a[$1]; print}
: maintenant, dans le deuxième fichier, définissez le 1er champ sur la valeur enregistrée dans le tableaua
pour le 1er champ (donc, la valeur associée defile2
) et imprimez la ligne résultante.la source
NR == FNR
ne fonctionne pas correctement lorsque le premier fichier est vide. Voir ceci et la réponse associée pour une solution de contournementfile2
et n'est pasfile1
vide. Un comportement sain quandfile2
est vide est de rapporter le contenu defile1
. Le problème avecNR == FNR
est que le code qui lui est associé s'exécute sur le contenu defile1
whenfile2
is emptyPas besoin de awk, en supposant que les fichiers sont triés, vous pouvez utiliser coreutils join:
Production:
Si vos fichiers ne sont pas triés, vous pouvez soit les trier d'abord (
sort file1 > file1.sorted; sort file2 > file2.sorted
) puis utiliser la commande ci-dessus, soit, si votre shell prend en charge la<()
construction (bash le fait), vous pouvez faire:la source
Testé avec la commande ci-dessous et a bien fonctionné
production
la source