dividindo todos os números em um arquivo usando shell script

1

Eu tenho um arquivo com 27 colunas e 45.000 linhas

head test_1

    0   0   0   0   0   0   0   2   0   0   0   0   0   0   0   0   0   0   0   
    16  20  24  20  20  10  6   28  36  10  26  14  24  24  24  30  24  30  24  
    2   8   2   4   2   0   0   10  8   2   6   0   6   4   4   6   2   10  2   
    14  12  22  16  18  10  6   20  28  8   20  14  18  20  20  24  22  20  22  
    0   0   0   0   0   0   0   2   2   0   0   0   0   0   0   0   0   2   0   
    16  20  24  20  20  10  6   30  36  10  26  14  24  24  24  28  22  30  24  
    0   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

Eu quero dividir cada valor por um número constante (aqui 2) usando o shell script. Como eu posso fazer isso? Eu tentei algo como awk -v c=2 '{ print $0/c }' test_1 , mas imprime apenas a primeira coluna!

    
por Anna1364 04.04.2018 / 19:06

2 respostas

2

Sim, awk -v c=2 '{ print $0/c }' test_1 imprimiria apenas a primeira coluna, pois tentaria dividir cada linha completa com c . A conversão da linha em um único número joga fora tudo o que não é um número, ou seja, o primeiro espaço em branco e tudo depois dele.

Em vez disso, você precisa fazer um loop pelas colunas:

awk -v c=2 '{ for (i = 1; i <= NF; ++i) $i /= c; print }' OFS='\t' test_1

Esse código simplesmente define o valor de cada coluna para si mesmo dividido por c e, em seguida, imprime a linha com os valores modificados. NF é o número de campos (colunas) na linha atual e $i será o valor na coluna i . O OFS='\t' no final define o separador do campo de saída como um caractere de tabulação.

O resultado para os dados fornecidos será

0       0       0       0       0       0       0       1       0       0       0       0       0       0       0       0       0       0       0
8       10      12      10      10      5       3       14      18      5       13      7       12      12      12      15      12      15      12
1       4       1       2       1       0       0       5       4       1       3       0       3       2       2       3       1       5       1
7       6       11      8       9       5       3       10      14      4       10      7       9       10      10      12      11      10      11
0       0       0       0       0       0       0       1       1       0       0       0       0       0       0       0       0       1       0
8       10      12      10      10      5       3       15      18      5       13      7       12      12      12      14      11      15      12
0       1       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
    
por 04.04.2018 / 19:12
0

Muito perto, mas você precisa dividir cada coluna individualmente:

awk -v denominator=2 '{ for( i=0;i<=NF;i++ ) { printf "%f%s",  $i/denominator, OFS }; printf "%s", ORS  }' /path/to/file
    
por 04.04.2018 / 19:13