Tengo dos archivos separados por tabulaciones que se ven de la siguiente manera:
archivo1:
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
file2:
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
Quiero hacer coincidir la columna 1 del archivo1 con el archivo2 y reemplazarla con la entrada respectiva de la columna 2 del archivo 2. La salida se vería así:
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

Respuestas:
Puede hacer esto muy fácilmente con
awk:O, dado que parece un archivo separado por tabulaciones:
Esto supone que cada
NC_*Id de RefSeq ( )file1tiene una entrada correspondiente enfile2.Explicación
NR==FNR: NR es el número de línea actual, FNR es el número de línea del archivo actual. Los dos serán idénticos solo mientrasfile2se lee el primer archivo (aquí ).a[$1]=$2; next: si este es el primer archivo (ver arriba), guarde el segundo campo en una matriz cuya clave es el primer campo. Luego, pasa a lanextlínea. Esto garantiza que el siguiente bloque no se ejecute para el primer archivo.{$1=a[$1]; print}: ahora, en el segundo archivo, establezca el primer campo en cualquier valor guardado en la matrizapara el primer campo (por lo tanto, el valor asociado defile2) e imprima la línea resultante.fuente
NR == FNRno funciona correctamente cuando el primer archivo está vacío. Vea esto y la respuesta asociada para una solución alternativafile2y nofile1está vacío. El comportamiento correcto cuandofile2está vacío es informar el contenido defile1. El problema conNR == FNRes que el código asociado se ejecuta en el contenido defile1cuandofile2está vacíoNo es necesario awk, suponiendo que los archivos estén ordenados, puede usar coreutils join:
Salida:
Si sus archivos no están ordenados, puede ordenarlos primero (
sort file1 > file1.sorted; sort file2 > file2.sorted) y luego usar el comando anterior o, si su shell admite la<()construcción (bash sí), puede hacer:fuente
Probado con el siguiente comando y funcionó bien
salida
fuente