com awk
:
awk '{ printf("%.3g %.3g\n", $1, $2) }' file
Com os dados fornecidos, isso produz
0.993 0.00704
0.646 0.354
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.5 0.5
Note que 0,00704 tem cinco casas decimais, mas três dígitos significativos.
Se você quiser exatamente três decimais, use %.3f
em vez de %.3g
e obtenha
0.993 0.007
0.646 0.354
0.993 0.007
0.993 0.007
0.993 0.007
0.993 0.007
0.993 0.007
0.993 0.007
0.500 0.500
As duas variações acima podem ser generalizadas para um número variável de colunas, usando o GNU awk
:
awk -v CONVFMT='%.3g' '{ for (i=1; i<=NF; ++i) $i+=0; print }' file
O loop com $i+=0
força awk
a reformatar o valor de cada campo como um número de ponto flutuante, o que ele fará levando em conta CONVFMT
(ele fará mais ou menos o equivalente a% código%).
Se você quiser cortar os números:
awk '{ for (i=1; i<=NF; ++i) $i=sprintf("%.5s", $i); print }' file
Isto trata os números como strings e os corta depois de cinco caracteres (o que assume que todos os números são menores que 10 e maiores que zero) gerando
0.992 0.007
0.646 0.353
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.5 0.5
Para um corte um pouco mais geral dos números:
awk '{ for (i=1; i<=NF; ++i) if (match($i,".*\.[0-9]?[0-9]?[0-9]?")) $i=substr($i,RSTART,RLENGTH); print }' file
A operação no loop corta os números no ponto em que a correspondência da expressão regular dada termina (se corresponder).