Tengo file1 me gusta:
0 AFFX-SNP-000541 NA
0 AFFX-SNP-002255 NA
1 rs12103 0.6401
1 rs12103_1247494 0.696
1 rs12142199 0.7672
Y un archivo2:
0 AFFX-SNP-000541 1
0 AFFX-SNP-002255 1
1 rs12103 0.5596
1 rs12103_1247494 0.5581
1 rs12142199 0.4931
Y quisiera un archivo3 tal que:
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
Lo que significa poner la cuarta columna del archivo2 en el archivo1 por el nombre de la segunda columna.
text-processing
awk
join
bioinformatics
Dadong Zhang
fuente
fuente
Respuestas:
Esto debería hacerlo:
Importante : esto supone que sus archivos están ordenados (como en su ejemplo) de acuerdo con el nombre de SNP. Si no lo están, ordénelos primero:
Salida:
Explicación (de
info join
):Entonces, el comando anterior une los archivos en el segundo campo e imprime el primer, segundo y tercer campo del archivo uno, seguido del tercer campo del archivo2.
fuente
Podrías usar
awk
:salida:
Explicación:
Recorrer
file2
(NR==FNR
solo es cierto para el primer argumento de archivo). Guardar en la columna 3 de hash-array usando la columna 2 como la clave:h[$2] = $3
. Luego recorrafile1
y genere las tres columnas$1,$2,$3
, agregando la columna guardada correspondiente de la matriz hashh[$2]
.fuente
h[$2] = $3
es una tarea hash. Se guarda$3
como el valor y$2
como la clave. Ejemplo:h["name"] = "Dadong"
. Ahora,print h["name"]
salidasDadong
. Hace lo que quiere, coincide exactamente con la segunda columna de ambos archivos.Si no necesita ningún pedido, una solución simple sería
Esto supone que todas las filas tienen tres entradas, y las columnas 1 y 2 de ambos archivos son iguales (como en los datos de ejemplo)
fuente
paste
paste
¿puedes encontrar una manera de responder esto con coreutils?