Estou tentando manipular um arquivo que contém números em notação científica, mas sem o e
símbolo, ou seja, 1.2e+3
está escrito como 1.2+3
.
A coisa mais fácil que pensei em fazer awk
foi substituir +
por e+
, usando a gsub
função e fazer meu cálculo no novo arquivo. O mesmo vale para o caso negativo. Portanto, uma correção simples pode ser feita usando o seguinte comando
awk '{gsub("+", "e+", $1); print $1, $2, $3, $4, $5}' file_in
e faça o mesmo em todas as colunas.
No entanto, o arquivo também contém números negativos, o que torna as coisas um pouco mais complicadas. Um arquivo de exemplo pode ser visto abaixo
1.056000+0 5.000000-1 2.454400-3 2.914800-2 8.141500-6
2.043430+1 5.000000-1 2.750500-3 2.698100-2-2.034300-4
3.829842+1 5.000000-1 1.969923-2 2.211364-2 9.499900-6
4.168521+1 5.000000-1 1.601262-2 3.030919-2-3.372000-6
6.661784+1 5.000000-1 5.250575-2 3.443669-2 2.585500-5
7.278104+1 5.000000-1 2.137055-2 2.601701-2 8.999800-5
9.077287+1 5.000000-1 1.320498-2 2.961020-2-1.011600-5
9.248130+1 5.000000-1 3.069610-3 2.786329-2-6.317000-5
1.049935+2 5.000000-1 4.218794-2 3.321955-2-5.097000-6
1.216283+2 5.000000-1 1.432105-2 3.077165-2 4.300300-5
Alguma idéia de como manipular e cálculos com esse arquivo?
text-processing
awk
Thanos
fonte
fonte
Respostas:
Esta saída está correta?
Código:
Explicação:
-lne
cuide das terminações da linha, processe cada linha de entrada, execute o código a seguirs/(\.\d+)(\+|\-)/\1e\2/g
:s
)(.\d+)(\+|\-)
encontre dois grupos de (um ponto e números) e (um mais ou menos)\1e\2
substitua-os pelo primeiro grupo ee
depois pelo segundo grupog
globalmente - não pare na primeira substituição em cada linha, mas processe todos os hits possíveisprint
imprima a linhasample
Arquivo de entradaEste adiciona espaço se estiver faltando. De fato, coloca espaço entre os números, independentemente. Ou seja. se houvesse dois espaços em algum caso, haveria apenas um na saída.
A maior parte é semelhante à anterior. A novidade é o
(\d+)
grupo nº 3 e o(\s*)
grupo nº 4.*
aqui significa opcional. Na substituição, não\4
é usado. Há um espaço em seu lugar.A saída é esta:
fonte
.
no primeiro grupo. Isto está correto. Sem essa barra invertida, o ponto não significaria um ponto literal.Você também pode usar
sed
, por exemplo:No entanto, isso não leva em consideração que as colunas na listagem do OP às vezes não são separadas. Aqui está uma solução alternativa com precisão apropriada:
Resultado:
fonte
2.698100-2-2.034300-4
OFMT
variável a precisão conjunto de awk para o mesmo que o de entrada