Usando o awk para dividir o número em cada linha de um arquivo pelo valor máximo naquele arquivo

0

Eu tenho um arquivo como este:

0.0451660231
0.0451660231
0.0527343825
0.3933106065
0.3970947862
0.0489502028
0.3592529595
0.3592529595
0.3592529595
0.3630371392
0.3630371392
0.3668213189
0.4008789659
0.1397705227

e quero dividir cada linha pelo valor máximo.

eu fiz

cut -f1 -d"," CVBR1_hist | sort -n | tail -1 > maximum
awk -v c=$maximum '{print $1/c}' CVBR1_hist > CVBR1_norm

Eu tenho este erro:

awk: cmd. line:1: (FILENAME=CVBR1_hist FNR=1) fatal: division by zero attempted

Eu não sei como resolver isso. Alguém pode me ajudar?

    
por Joana Carvalho 24.01.2017 / 15:24

3 respostas

2

Vamos supor que a classificação do conteúdo do arquivo CVBR1_hist numericamente gere os dados corretos:

$ sort -n CVBR1_hist
0.0451660231
0.0451660231
0.0489502028
0.0527343825
0.1397705227
0.3592529595
0.3592529595
0.3592529595
0.3630371392
0.3630371392
0.3668213189
0.3933106065
0.3970947862
0.4008789659

Em seguida, podemos armazenar o máximo em uma variável usando uma substituição de comando como esta:

maximum="$( sort -n CVBR1_hist | tail -n 1 )"

Os valores normalizados podem então ser obtidos com awk :

awk -v m="$maximum" '{ print $1/m }' CVBR1_hist >CVBR1_norm

Então, a única coisa que você estava perdendo era o armazenamento adequado do máximo em uma variável.

    
por 24.01.2017 / 15:43
2

Aqui está uma solução awk de uma passagem, mas armazena todos os dados na memória em uma matriz. Execute como: awk -f thisprogram.awk < CVBR1_hist > CVBR1_norm

{
  elements[NR]=$1
  if ($1 > largest) {
    largest = $1
  }
}
END {
  for(i=1; i <= NR; i++)
    printf "%.10f\n", elements[i]/largest
}
    
por 24.01.2017 / 20:35
0

O awk fornece um erro porque a variável "c" é definida como igual a uma variável vazia. O máximo de $ ainda não está definido.

Você deve fazer:

awk -v c='cat maximum' '{print $1/c}' CVBR1_hist > CVBR1_norm

Aqui é onde seu comando falhou.

Melhor maneira: não passar por um arquivo temporário, mas armazenar o valor máximo em uma variável, como a resposta de Kusalananda .

    
por 24.01.2017 / 15:53