![添加具有与另一列的标识符匹配的值的列](https://linux22.com/image/154356/%E6%B7%BB%E5%8A%A0%E5%85%B7%E6%9C%89%E4%B8%8E%E5%8F%A6%E4%B8%80%E5%88%97%E7%9A%84%E6%A0%87%E8%AF%86%E7%AC%A6%E5%8C%B9%E9%85%8D%E7%9A%84%E5%80%BC%E7%9A%84%E5%88%97.png)
我有两个文件:
文件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