格式更改文件中的数据。多个 sed 命令?

格式更改文件中的数据。多个 sed 命令?

我想要一些关于更改文件中某些数据格式的建议。

我的文件中有大量数据。这是大型 Fortran 程序的输出,其格式为 latex 表。我希望更改格式,但无法使用其他格式重新运行 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 \\

答案1

这是您的 sed 表达式:

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

内容如下

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

... 用 10^{[没有空格的单词]} 替换所有出现的 D+[没有空格的单词]

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

... 将所有出现的 [空格][不包含空格和 &-chars 的单词][空格] 替换为 [空格]$[不包含空格和 &-chars 的单词]$[空格]

s/^/$/

...并在行前加上 $ 符号(上面的表达式没有捕捉到)

答案2

下面是一个 Perl 单行代码,分两步完成替换...

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 中。

答案3

小菜一碟。我什么时候才能有使用古老程序生成乳胶的项目?:(

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

相关内容