Agregar columna con valores que coincidan con los identificadores de otra columna

Agregar columna con valores que coincidan con los identificadores de otra columna

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 y NR==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

información relacionada