
我有兩個文件:
文件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