awk
tem uma função sprintf, que dá acesso ao especificador de formato printf "f".
echo .123456 | awk '{ print sprintf("%.9f", $1); }'
produz
0.123456000
Quando eu converto MB em GB, estou ficando abaixo da saída. Eu quero essa saída no formato normal. Quando uso bc
, estou recebendo um erro. O arquivo de texto contém quase 100 linhas como essa.
Eu quero imprimir isso na saída normal, (sem notação):
1.14441e-07
4.95911e-07
3.05176e-07
1.90735e-07
3.05176e-07
Comandos:
$ DIVISOR=104857600
$ sudo du --max-depth=1 /home/xxx | tail -1 | \
awk -v DIVISOR=104857600 '{print $1/DIVISOR}'
1.14441e-07
Para controlar a formatação da saída, você pode usar printf
diretamente de awk
ou diretamente via shell.
No entanto, você também pode controlar a saída diretamente usando du
. Por exemplo, você pode especificar -h
para produzir os resultados em formatos legíveis por humanos.
$ du -h --max-depth=1 /home/saml/apps | tail -1
9.0G /home/saml/apps
$ du -h --max-depth=1 /home/saml/apps/gCAD3D | tail -1
1.1M /home/saml/apps/gCAD3D
Mas, como você percebeu, você perde a resolução com esse método. Portanto, se você realmente quiser manter um grau mais alto de resolução, será forçado a usar os valores de du
em um nível inferior e, em seguida, formatar a saída para se adequar a cada unidade de nível superior desejada.
Em MBs usando du
.
$ du -m --apparent-size --max-depth=1 /home/saml/apps | tail -1
8916 /home/saml/apps
Usando awk
+ printf
.
$ DIVISOR=10487600
$ du --apparent-size --max-depth=1 /home/saml/apps | \
tail -1 | awk -v D=$DIVISOR '{printf "%.9f\n", $1/D}'
0.870499638
Você pode controlar a precisão desejada alterando o argumento para printf
. Aqui estão 5 lugares.
$ DIVISOR=10487600
$ du --apparent-size --max-depth=1 /home/saml/apps | \
tail -1 | awk -v D=$DIVISOR '{printf "%.5f\n", $1/D}'
0.87050
Observe que é necessário arredondá-lo corretamente sempre que você decidir cortar a precisão.