Sformatuj dane zmian w pliku. Wiele poleceń sed?

0

Chciałbym uzyskać porady dotyczące zmiany formatowania niektórych danych w pliku.

Mam dużą ilość danych w pliku. Jest to wynik dużego programu Fortran, sformatowany dla tabeli lateksowej. Chcę zmienić formatowanie, ale nie mogę ponownie uruchomić programu Fortran z alternatywnym formatowaniem danych wyjściowych. Bawiłem się sedem, ale nie za bardzo.

Pojedyncza linia z tabeli ma obecnie format

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

Chcę to zmienić na

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

Obecnie mam

#!/bin/bash

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

co prowadzi mnie do tego stopnia

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

ale nadal muszę dodać nawias zamykający i zawinąć każdą liczbę w parę symboli `$ '.

Jednym słowem zmieniłbym również dane na 3 dp, ale jest to mniej ważne.

Dowolni mistrzowie sed / regex, którzy są w stanie pomóc, a może sugestia innego narzędzia, które może lepiej pasować do tego problemu.

Dzięki

Tommy

Właśnie zdałem sobie sprawę z tego, że wszystkie moce są +01 w tej linii, to jest szansa, mogą być dowolne i różnią się w zależności od pliku, pozytywne i negatywne. Kolejny przykładowy wiersz z niektórymi NaNs wrzuconymi.

0.3 & 0.634620D-02 & NaN & NaN & -0.312678D-02 & 0.192654D-03 \\
Tommy
źródło

Odpowiedzi:

0

A oto twój wyraz twarzy:

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

który brzmi jak

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

... zamień wszystkie wystąpienia D + [słowo bez spacji] na 10 ^ {[słowo bez spacji]}

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

... zamień wszystkie wystąpienia [spacja] [słowo nie zawierające spacji i & -chars] [spacja] na [spacja] $ [słowo nie zawierające spacji i & -chars] $ [spacja]

s/^/$/

... i poprzedź wiersz znakiem $ (który nie został przechwycony przez powyższe wyrażenie)

Barbaz
źródło
0

Oto linijka Perla, która dokonuje podstawień w 2 krokach ...

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

Edytować...

Okej, w oparciu o zmienione wymagania ...

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

W tym momencie i później powinieneś prawdopodobnie napisać odpowiedni skrypt, ale działa to z przykładowymi danymi, które podałeś. Możesz skopiować i wkleić go do basha, jak jest.

Joe Internet
źródło
Dzięki. Czy można to zmienić, kiedy potęga wykładnika może być czymkolwiek? Dopiero co zauważyłem na przykładzie, który podałem, to wszystko +01 przez większość czasu się zmienia, oba pozytywne i negatywne.
Tommy,
Dzięki, podoba mi się to i bawiłem się zmieniając go, próbując umieścić go w skrypcie perla, ale z powodu mojej zerowej wiedzy o perlu miałem trudności z kilkoma drobnymi sprawami. Jeszcze raz spróbuję, ale wróciłem do sed solon, bo to wiem.
Tommy
Konstrukcja perl -pe '' służy do uruchamiania skryptu Perl z wiersza poleceń jako jednowierszowy. Powyższe pobiera in.txt jako dane wejściowe, przetwarza je, a następnie wyświetla wynik jako out.txt. Konieczne może być naprawienie ścieżek lub uruchomienie go w katalogu in.txt. Aby uzyskać informacje na temat używania Perla jako awk / sed / grep / etc. wymiana, patrz książka Minimal Perl autorstwa Tima Mahera.
Joe Internet,
0

Bułka z masłem. Kiedy będę miał projekty ze starożytnymi programami produkującymi lateks? :(

$ 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}$ \\
Ярослав Рахматуллин
źródło