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 ( )file1
tiene 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 mientrasfile2
se 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 lanext
lí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 matriza
para el primer campo (por lo tanto, el valor asociado defile2
) e imprima la línea resultante.fuente
NR == FNR
no funciona correctamente cuando el primer archivo está vacío. Vea esto y la respuesta asociada para una solución alternativafile2
y nofile1
está vacío. El comportamiento correcto cuandofile2
está vacío es informar el contenido defile1
. El problema conNR == FNR
es que el código asociado se ejecuta en el contenido defile1
cuandofile2
está 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