Formata os dados alterados no arquivo. Vários comandos sed?

0

Gostaria de receber 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 brincado 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 \

Desejo alterá-lo para

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

Atualmente tenho

#!/bin/bash

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

que me leva até

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 d.p, 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 esse problema.

Obrigado

Tommy

Acabei de perceber no exemplo todos os poderes são +01 nesta linha, isso é acaso, 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 \
    
por Tommy 17.06.2011 / 22:54

3 respostas

0

E aqui está sua expressão sed:

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

que lê como

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

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

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

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

s/^/$/

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

    
por 17.06.2011 / 23:47
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 & cole-o no bash como é.

    
por 17.06.2011 / 23:22
0

Pedaço de bolo. 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]*\)/\&$ 10^{0}$/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}$ \
    
por 18.06.2011 / 08:26

Tags