我想要一些关于更改文件中某些数据格式的建议。
我的文件中有大量数据。这是大型 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}$ \\