他の列の識別子と一致する値を持つ列を追加します。

他の列の識別子と一致する値を持つ列を追加します。

2つのファイルがあります。

ファイル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の行の最初の列値でインデックス付けされ、2番目の列(平均)値を含む連想配列(またはハッシュ)を作成します。平均を浮動小数点形式で表示する必要がない場合は、この手順を簡略化してすべての値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

関連情報