Como calcular tomando o primeiro campo

1

Estou tentando fazer um cálculo como esse, eu tenho um arquivo de texto com números como

459
455
463

E devo calcular a porcentagem desses números em relação a 600. Quero dizer exatamente

(459/600)*100 que será minha porcentagem, 459 sendo obtida do arquivo de texto.

Alguém poderia me ajudar por favor?

    
por rɑːdʒɑ 15.10.2013 / 03:53

6 respostas

7

ok, agora o questino mudou quase completamente ^^ Agora você precisa calcular, dados números, quantos% representam em relação ao número 600.

Aqui está uma versão revisada.

Deixei minha velha resposta abaixo por motivo histórico ^^

nova resposta:

awk ' { printf "%s %.2f%\n",$1,($1/600)*100; }'  numbers.txt

ie, supondo que o arquivo "numbers.txt" contenha apenas 1 coluna com um número entre 0 e 600, basta imprimir o número, e na coluna seguinte o% que ele representa em relação a 600. Eu poderia simplificar o segundo cálculo como ($ 1/6) "%", mas, na minha opinião, retiraria as informações importantes do script.

nos novos dados de exemplo que ele gera:

459 76.50%
455 75.83%
463 77.17%

resposta antiga:

Se você realmente precisa calcular a porcentagem , então seria algo como:

awk '
     { # each line is read and stored, and the sum is computed also.
       original[NR]=$0 ; #store the current line (line NR) in the "original[]" tab
       sum+=$1       ; #and compute the sum of the 1st column
     }
END  { #at the END, ie after we processed the whole file
       for(line=1;line<=NR;line++)
       {   printf "%s %.2f%\n",original[line],original[line]/sum*100 ;
       }
     } '  numbers.txt

algo assim deve calcular o% e colocá-lo ao lado do número (com 2 dígitos fracionários)

no seu exemplo, ele gera:

12 5.36%
23 10.27%
35 15.62%
67 29.91%
87 38.84%
    
por 15.10.2013 / 12:52
8

Se o seu arquivo é realmente apenas uma lista de números, um por linha, faça o seguinte:

awk '{print $1,$1"%"}' numbers.txt 

ou, em sed :

sed -r 's/(.+)/ %/' numbers.txt
    
por 15.10.2013 / 04:21
5
$ paste -d' %' numbers.txt numbers.txt /dev/null
12 12%
23 23%
35 35%
67 67%
87 87%
A opção

-d tem vários delimitadores: Espaço em branco e Porcentagem aqui

    
por 15.10.2013 / 05:10
2

O mesmo que @ slm, apenas usando a classe de caractere:

$  sed -r 's/([[:digit:]]+)/ %/g' numbers.txt
    
por 15.10.2013 / 04:12
2

Isso pode ser feito facilmente com sed .

Se os números estiverem organizados:

12 23 35 67 87

Exemplo

$ sed 's/\([0-9]\+\)/ %/g' somefile.txt
12 12% 23 23% 35 35% 67 67% 87 87%

Detalhes

  1. Estamos usando a capacidade de sed de pesquisar e substituir ( s/../../g ).
  2. \([0-9]\+\) corresponde a qualquer sequência de números (12, 23, ..). Os parens ao redor disso salvam esses resultados em uma variável temporária ( ).
  3. Cada vez que encontramos uma sequência de números correspondente, nós a substituiremos por ela & outra cópia de si mesmo e um sinal de porcentagem ( % )

OBSERVAÇÃO: se a versão de sed for compatível com a opção -r , você poderá condensar ligeiramente acima:

$ sed -r 's/([0-9]+)/ %/g' somefile.txt
12 12% 23 23% 35 35% 67 67% 87 87%

Se eles estiverem organizados:

12
23
35
67
87

Exemplo

$ sed -r 's/([0-9]+)/ %/g' somefile.txt
12 12%
23 23%
35 35%
67 67%
87 87%
    
por 15.10.2013 / 04:08
0

Por que não usar um simples cat seguido por echo construindo e executando a linha de comando do stdin?

cat somefile.txt|xargs -I {} echo "{} {}%" > somefile.out
    
por 15.10.2013 / 16:55

Tags