Adicionar coluna com valores correspondentes aos identificadores de outra coluna

Adicionar coluna com valores correspondentes aos identificadores de outra coluna

Eu tenho dois arquivos:

Arquivo 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  

Arquivo 2

hc       mean
cluster0 0.35
cluster1 0.4   
cluster2 0.9

E eu gostaria de criar uma nova tabela como:

Arquivo 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

Como posso fazer isso no bash? Existe algum comando que possa fazer isso facilmente?

Responder1

Isso pode ser feito facilmente no 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

As etapas são:

  • para linhas no primeiro arquivo nomeado ( NR==FNR), crie uma matriz associativa (ou hash) indexada pelos valores da primeira coluna e contendo os valores da segunda coluna (média). Se você não precisa que os valores médios sejam exibidos no formato de ponto flutuante, você pode simplificar esta etapa para NR==FNR {a[$1] = $2}tratar todos os valores (incluindo o cabeçalho) como strings.

  • caso contrário, imprima a linha seguida pelo valor no array cujo índice corresponde à primeira coluna

Responder2

Tentei com o script abaixo e funcionou bem também

comando

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'

saída

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

informação relacionada