
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 paraNR==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