Добавить столбец со значениями, соответствующими идентификаторам другого столбца

Добавить столбец со значениями, соответствующими идентификаторам другого столбца

У меня есть два файла:

Файл 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  

Файл 2

hc       mean
cluster0 0.35
cluster1 0.4   
cluster2 0.9

И я хотел бы создать новую таблицу вроде:

Файл 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

Как это сделать в bash? Есть ли команда, которая может это легко сделать?

решение1

Это можно легко сделать в 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

Шаги следующие:

  • для строк в первом именованном файле ( NR==FNR), создайте ассоциативный массив (или хэш), индексированный по значениям первого столбца и содержащий значения второго столбца (средние). Если вам не нужно, чтобы средние значения отображались в формате с плавающей точкой, вы можете упростить этот шаг, NR==FNR {a[$1] = $2}обрабатывая все значения (включая заголовок) как строки.

  • в противном случае выведите строку, за которой следует значение в массиве, индекс которого соответствует первому столбцу.

решение2

Попробовал с приведенным ниже скриптом, и он тоже отлично сработал.

команда

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'

выход

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

Связанный контент