Calcular e arredondar números para cima em bash

3

Estou lutando com uma ligeira variação em: Como calcular tomando o primeiro campo e Como arredondar os números de ponto flutuante no shell?

Eu tenho um arquivo que se parece com (espaço entre colunas):

1533 C_P.doc
691 C_M.doc
905 G_S.doc
945 J_Z.doc
1549 J_M.doc
1701 L_B.doc

Eu quero pegar a coluna de números e dividir cada número por 65 (mas arredondar para cima) e adicionar uma nova coluna (idealmente à esquerda) com esses números incluídos. ou seja,

24 1533 C_P.doc
11 691 C_M.doc
14 905 G_S.doc
15 945 J_Z.doc
24 1549 J_M.doc
27 1701 L_B.doc

Eu gostaria disso em um script bash. É possível? Se necessário, a coluna do meio pode ser removida se isso facilitar.

[Ubuntu 14.04]

    
por ugm6hr 12.12.2014 / 08:28

3 respostas

2

Através de awk e mantendo a coluna do meio:

awk '{printf("%.f ", ($1/65)+0.5)}1' infile > outfile
24 1533 C_P.doc
11 691 C_M.doc
14 905 G_S.doc
15 945 J_Z.doc
24 1549 J_M.doc
27 1701 L_B.doc

Através de awk e sem coluna do meio:

awk '{printf("%.f", ($1/65)+0.5); $1=""}1' infile > outfile
24 C_P.doc
11 C_M.doc
14 G_S.doc
15 J_Z.doc
24 J_M.doc
27 L_B.doc

Observe que +0.5 é usado como substituto da função ceil() e arredondado para o próximo número. E 1 no final ativa a impressão padrão.

    
por 12.12.2014 / 09:10
1

Você pode usar perl :

$ perl -MPOSIX=ceil -anle '$F[0] = ceil($F[0]/65);print "@F"' file
24 C_P.doc
11 C_M.doc
14 G_S.doc
15 J_Z.doc
24 J_M.doc
27 L_B.doc
    
por 12.12.2014 / 08:38
0

Se você não se importa em usar python no shell e assumir que a.txt é o seu arquivo:

[sreeraj@server ~]$ cat a.txt
1533 C_P.doc
691 C_M.doc
905 G_S.doc
945 J_Z.doc
1549 J_M.doc
1701 L_B.doc
[sreeraj@server ~]$ for i in $(awk -v c=65 '{ print $1/c }' a.txt) ; do python -c 'print int(round('$i',0))' ; done >> b.txt
[sreeraj@server ~]$ paste b.txt a.txt > c.txt
[sreeraj@server ~]$ cat c.txt
24      1533 C_P.doc
11      691 C_M.doc
14      905 G_S.doc
15      945 J_Z.doc
24      1549 J_M.doc
26      1701 L_B.doc
[sreeraj@server ~]$

Isto irá criar o arquivo c.txt com a saída desejada.

Como funciona:

Ele usa awk para dividir os valores na primeira coluna de a.txt por 65 e, em seguida, usar a função interna python de round() para arredondar os decimais. Em seguida, criamos um arquivo c.txt com a saída do loop 'for' e usamos paste para combinar o c.txt e a.txt

    
por 12.12.2014 / 09:00