Crie um campo que possa armazenar valores calculados a partir de valores em outro arquivo

3

Eu tenho dois arquivos, o primeiro deles (delimitado por tabulação):

1    100    371    R1,R2,R4    12
5    167    16     R2,R5       5
8    242    490    R1,R3,R4    11

outro se parece com:

R1   0.167
R2   0.171
R3   0.156
R4   0.162
R5   0.159

Eu quero adicionar mais um campo no primeiro arquivo, os valores neste campo são a soma dos valores correspondentes de R1, R2, ..., R5 no segundo arquivo, em seguida, dividido pelos valores no quarto campo .

Por exemplo, a primeira linha tem R1, R2, R4, então o valor que eu quero é (0,167 + 0,171 + 0,162) / 12 = 0,0416667

Resultado esperado:

1    100    371    R1,R2,R4    12    0.0416667
5    167    16     R2,R5       5     0.066
8    242    490    R1,R3,R4    11    0.0440909

Como escrever o comando awk?

    
por MagicPants 07.08.2017 / 11:36

1 resposta

5
Solução

awk :

awk 'NR==FNR{ a[$1]=$2; next };{ len=split($4,b,","); s=0; 
     for(i=1;i<=len;i++) s+=a[b[i]]; $6=s/$5 }1' file2 OFS='\t' file1 | column -tx

A saída:

1  100  371  R1,R2,R4  12  0.0416667
5  167  16   R2,R5     5   0.066
8  242  490  R1,R3,R4  11  0.0440909
  • a[$1]=$2 - capturando chaves / valores do segundo arquivo

  • split($4,b,",") - dividindo o quarto campo do primeiro arquivo em matriz de "chaves"

  • len - número de blocos

  • s+=a[b[i]] - acumulando valores para as "chaves" correspondentes

por 07.08.2017 / 11:47