0

我的问题是,在一列数据中,有几个指数值,通常是 2.796e-05 的形式。'e' 前面的十进制值总是变化,但它似乎总是 e-05。

所以到目前为止我一直在尝试的(已经尝试了各种变化以希望它会起作用)是:

sed -i -e 's/[0-9]*\.[0-9]*e-05/0/g' datafile.txt

到目前为止,我所有的尝试都没有任何结果。现在我确定我只是遗漏了一件小事或类似的事情,但我看不到它,所以任何帮助将不胜感激。

根据要求:输入是一个大文件,格式为

19990207 8.891 6.1756 07/02/1999 9.707767 Q31
19990208 0.87234 5.2431 08/02/1999 10.239032 Q31
19990209 4.8225e-06 4.2400 09/02/1999 12.312976 Q31
19990210 0.00013825 5.3127 10/02/1999 10.353386 Q31
(The above is tab seperated but我不知道如何在这里展示这个)

对于输出,我基本上不会将粗体部分设为 0。但在有指数的地方没有得到 0,似乎什么都没有发生,并且输出与输入保持相同。

使用代码的脚本有点长,但如果有帮助,我可以发布它。

4

1 回答 1

1
re='-?([[:digit:]]+(\.[[:digit:]]*)?|[[:digit:]]*\.[[:digit:]]+)[Ee]-[[:digit:]]+'
sed -r "s/$re/0/g" file

That regular expression will accept numbers like -3e-3, 3.1e-1234, .14159E-01 -- there is:

  • an optional negative sign
  • followed by either
    • mandatory digits and optional dot and fractional digits or
    • optional digits and a mandatory dot and fractional digits
  • followed by E or e and a negative integer.

I use the POSIX [:digit:] character class because it's available.

I save the regular expression in a variable to make maintenance a little easier. Then you have to use double quotes around the sed program body so the shell variable can be substituted.

Using sed's -r flag means you can avoid a lot of backslash escapes. It is (I think) a GNU sed extension, but you tagged your question so you should have it.

于 2013-08-29T19:07:15.907 回答