Я хотел бы получить совет по изменению форматирования некоторых данных в файле.

У меня есть большой объем данных в файле. Это вывод большой программы на Фортране, он отформатирован для латексной таблицы. Я хочу изменить форматирование, но не могу перезапустить программу Fortran с альтернативным форматированием для вывода. Я играл с sed, но не очень далеко.

Одна строка из таблицы в настоящее время в формате

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

Я хочу изменить это на

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

У меня сейчас

#!/bin/bash

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

что доходит до меня

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

но мне все еще нужно добавить закрывающую скобку и обернуть каждое число в пару символов `$ '.

Одним словом, я бы тоже изменил данные на 3 dp, но это менее важно.

Любые мастера sed / regex, способные помочь, или, возможно, предложение другого инструмента, который может лучше подходить для этой проблемы.

Спасибо

Томми

Я только что понял в примере, что все силы равны +01 в этой строке, это шанс, они могут быть любыми и могут быть разными, несмотря на файл, положительный и отрицательный. Еще один пример строки с несколькими добавленными NaN.

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

3 ответа3

0

Кусок пирога. Когда у меня будут проекты с древними программами, которые производят латекс? :(

$ 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}$ \\
0

Вот одна строчка Perl, которая делает замены в 2 шага ...

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

Редактировать...

Хорошо, на основании ваших измененных требований ...

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

На данном этапе и далее вам, вероятно, следует написать правильный скрипт, но он работает с предоставленными вами примерами данных. Вы можете скопировать и вставить его в Bash как есть.

0

А вот ваше выражение sed:

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

который читается как

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

... заменить все вхождения D+[слово без пробелов] на 10 ^ {[слово без пробелов]}

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

... заменить все вхождения [пробел] [слово, не содержащее пробелов и & -chars] [пробел], на [пробел] $ [слово, не содержащее пробелов и & -chars] $ [пробел]

s/^/$/

... и добавьте строку к знаку $ (который не был пойман с помощью выражения выше)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .