
Tengo dos archivos:
Archivo 1
hc Value
cluster0 0.1
cluster0 0.2
cluster0 0.3
cluster1 0.3
cluster1 0.5
cluster0 0.8
cluster2 0.9
cluster2 0.9
cluster0 0.0
Archivo 2
hc mean
cluster0 0.35
cluster1 0.4
cluster2 0.9
Y me gustaría crear una nueva tabla como:
Archivo 3
hc Value mean
cluster0 0.1 0.35
cluster0 0.2 0.35
cluster0 0.3 0.35
cluster1 0.3 0.40
cluster1 0.5 0.40
cluster0 0.8 0.35
cluster2 0.9 0.90
cluster2 0.9 0.90
cluster0 0.0 0.35
¿Cómo puedo hacer esto en bash? ¿Existe algún comando que pueda hacer esto fácilmente?
Respuesta1
Se puede hacer fácilmente en Awk:
$ awk 'NR==FNR {a[$1] = FNR==1 ? $2 : sprintf("%.2f",$2); next} {print $0,a[$1]}' File2 File1
hc Value mean
cluster0 0.1 0.35
cluster0 0.2 0.35
cluster0 0.3 0.35
cluster1 0.3 0.40
cluster1 0.5 0.40
cluster0 0.8 0.35
cluster2 0.9 0.90
cluster2 0.9 0.90
cluster0 0.0 0.35
Los pasos son:
para las líneas en el primer archivo nombrado (
NR==FNR
), cree una matriz asociativa (o hash) indexada por los valores de la primera columna y que contenga los valores (promedios) de la segunda columna. Si no necesita que los valores medios se muestren en formato de punto flotante, puede simplificar este paso yNR==FNR {a[$1] = $2}
tratar todos los valores (incluido el encabezado) como cadenas.de lo contrario, imprima la línea seguida del valor en la matriz cuyo índice coincide con la primera columna
Respuesta2
Probé con el siguiente script y también funcionó bien.
dominio
for i in `cat file2| awk '{print $1}'`; do p=`grep "$i" file2| awk '{print $2}'`; awk -v i="$i" -v p="$p" '$1 == i {$3=p;print $0}' file1; done|sed '1i hc Value mean'
producción
hc Value mean
cluster0 0.1 0.35
cluster0 0.2 0.35
cluster0 0.3 0.35
cluster1 0.3 0.40
cluster1 0.5 0.40
cluster0 0.8 0.35
cluster2 0.9 0.90
cluster2 0.9 0.90
cluster0 0.0 0.35