Formatar dados alterados no arquivo. Vários comandos sed?

0

Eu gostaria de alguns conselhos sobre como alterar a formatação de alguns dados em um arquivo.

Eu tenho uma grande quantidade de dados em um arquivo. Esta é uma saída de um grande programa Fortran, é formatada para uma tabela de látex. Desejo alterar a formatação, mas não posso executar novamente o programa Fortran com formatação alternativa para a saída. Eu tenho jogado com sed mas não tenho ido muito longe.

Uma única linha de uma tabela está atualmente no formato

0.1 & 0.166685D+01 & 0.162768D+01 & 0.139468D+01 & 0.126904D+01 & 0.133247D+01 \\

Eu gostaria de mudar isso para

0.1 & $0.16668510^{01}$ & $0.16276810^{01}$ & $0.13946810^{01}$ & $0.12690410^{01}$ & $0.133247 10^{01}$ \\

Eu tenho atualmente

#!/bin/bash

sed -i 's/D\+./ 10^{/g' $1

o que me leva tanto quanto

0.1 & 0.166685 10^{01 & 0.162768 10^{01 & 0.139468 10^{01 & 0.126904 10^{01 & 0.133247 10^{01 \\

mas ainda preciso adicionar a chave de fechamento e envolver cada número em um par de símbolos "$".

Em uma palavra ideal, eu também alteraria os dados para 3 pb, mas isso é menos importante.

Qualquer mestre em sed e regex capaz de ajudar, ou talvez uma sugestão de outra ferramenta que possa ser mais adequada para este problema.

obrigado

Tommy

Eu acabei de perceber no exemplo que todos os poderes são +01 nesta linha, isso é chance, eles podem ser qualquer coisa e variar pelo arquivo, positivo e negativo. Outra linha de exemplo com alguns NaNs lançados.

0.3 & 0.634620D-02 & NaN & NaN & -0.312678D-02 & 0.192654D-03 \\
Tommy
fonte

Respostas:

0

E aqui está sua expressão sed:

sed -e 's/D+\([^ ]*\)/10^{\1}/g' -e 's/ \([^ &]*\) / $\1$ /g' -e 's/^/$/'

que lê como

s/D+\([^ ]*\)/10^{\1}/g

... substitua todas as ocorrências de D + [palavra sem espaços] por 10 ^ {[palavra sem espaços]}

s/ \([^ &]*\) / $\1$ /g

... substitua todas as ocorrências de [espaço] [palavra que não contém espaços e & amp; -chars] [espaço] por [espaço] $ [palavra que não contém espaços e & amp; -chars] $ [space]

s/^/$/

... e prefixar a linha com um sinal de $ (que não foi capturado pela expressão acima)

barbaz
fonte
0

Aqui está um one-liner Perl que faz as substituições em 2 passos ...

perl -pe ' s/D\+01/10\^{01}\$/g; s/\& /\& \$/g; ' < in.txt > out.txt

Editar...

Ok, com base nos seus requisitos alterados ...

perl -pe ' 

s/ \& NaN//g;               # removes <space>&<space>NaN sequences
s/D\+/10\+/g;               # replace D+ with 10+
s/D\-/10\-/g;               # replace D- with 10- 
s/\+/\^{/g;                 # replace +  with ^{ 
s/(?<! )\-/\^{-/g;          # replace -  with ^{- if preceding char is not a <space> 
s/(?<!\.[0-9]) \&/\} \&/g;  # replace <space>& with }<space>& if preceding chars are not .<single-digit> seq. 
s/ \\/\} \\/g;              # replace <space>\ with }<space>\

' < in.txt > out.txt

Neste ponto e além, você provavelmente deve escrever um script adequado, mas isso funciona com os dados de amostra que você forneceu. Você pode copiar & amp; cole-o no bash como é.

Joe Internet
fonte
Obrigado. É possível alterá-lo quando o poder do expoente pode ser qualquer coisa? Eu só notei no exemplo que dei, é todo +01 na maioria das vezes varia, ambos positivo e negativo.
Tommy
Obrigado eu gosto disso e tenho brincado com alterá-lo tentando colocá-lo em um script perl, mas devido ao meu conhecimento zero de perl tiveram dificuldade com algumas pequenas coisas. Vou dar outro tempo, mas voltarei para o solenóide como é o que eu sei.
Tommy
A construção perl -pe '' é para executar um script Perl da linha de comando como um one-liner. O acima leva in.txt como entrada, processa e, em seguida, gera o resultado como out.txt. Talvez seja necessário corrigir os caminhos ou executá-lo no diretório in.txt. Para informações sobre como usar o Perl como um awk / sed / grep / etc. substituição, veja o livro Minimal Perl, de Tim Maher.
Joe Internet
0

Moleza; fácil; baba. Quando terei projetos com programas antigos que produzem látex? :(

$ cat tmp/latex-table 
echo '0.1 & 0.166685D+01 & 0.162768D+01 & 0.139468D+01 & 0.126904D-21 & 0.133247D+01 \\' |\
sed -e 's/&\([^0-9]*\)\([0-9\.]*\)D\([+\-]\)\([0-9]*\)/\&\1$\2 10^{0\3\4}$/g'
raptor: ~
$ bash tmp/latex-table 
0.1 & $0.166685 10^{0+01}$ & $0.162768 10^{0+01}$ & $0.139468 10^{0+01}$ & $0.126904 10^{0-21}$ & $0.133247 10^{0+01}$ \\
Ярослав Рахматуллин
fonte