Como posso encontrar min / max de uma coluna de valores e adicionar esse valor a todos os números de coluna?

0

Não consigo encontrar a sintaxe correta para este comando awk para encontrar o min e max de uma coluna de valores e adicionar ( -1*min ) valor a todos os valores de coluna (efetivamente zerando meus dados). Gostaria de receber ajuda! Muito obrigado!

awk 'NR==1 {max=$2; min=$2} $2>=max {max=$2} $2<=min {min=$2}' <  my_data.dat | awk '{printf("%-5d%+13.5f \n", NR, $2+(-1*min))}'  > my_new_data.dat
    
por Nadia 21.11.2016 / 11:15

1 resposta

1

Você pode passar por um arquivo duas vezes com a mesma sintaxe que você usaria para vários arquivos e apenas usar o mesmo arquivo duas vezes.

awk 'NR==1 { max=$1 ; min=$1 }
     FNR==NR { if ($1>=max) max=$1 ; $1<=min?min=$1:0 ; next}
     { $2=($1-min)/(max-min) ; print }' file file

Explicação detalhada:

NR==1 { max=$1 ; min=$1 } - adota valores do primeiro registro, você já fez isso

FNR==NR - awk com vários arquivos de entrada terá um valor NR para o número do índice geral do registro (ou seja, como se todos os arquivos fossem concatenados) e um valor FNR para o número do índice atual Arquivo. Se estes corresponderem, estamos processando o primeiro arquivo, ou seja, este bloco é executado apenas para o primeiro arquivo.

if ($1>=max) max=$1 - awk a sintaxe da instrução if é if (condition) action ; else if (condition) action ; else action . Obviamente, as declarações if else e else são opcionais.

$1<=min?min=$1:0 - e alternativo if sintaxe da instrução: condition?yes-action:no-action . Isso requer e, em seguida, ação, o sem sentido 0 . Apenas pelo seu interesse.

next - pula para o próximo arquivo, para que o bloco a seguir seja executado apenas para o segundo arquivo.

$2=($1-min)/(max-min) ; print - faça uma normalização para [0,1] (você não tem uso para max em seu exemplo, então usei isso ...) e imprima dados.

    
por 21.11.2016 / 13:13

Tags