替换现有文件中浮点数的精度

时间:2016-03-16 09:20:07

标签: bash

我有以下格式的大量大文件

<input type="text" name="tb1" id="textBoxHtml" />

这些数字都是截然不同的(由于我的懒惰,这里的数字相同)。

我想改变浮点数的精度。也就是说,我想用以下代码替换上一个文件:

step 80
1.10045e+07 1.10125e+07 1.20345e+07 2.40225e+07 4.30245e+07
1.10045e+07 1.10125e+07 1.20345e+07 2.40225e+07 4.30245e+07
1.10045e+07 1.10125e+07 1.20345e+07 2.40225e+07 4.30245e+07
1.10045e+07 1.10125e+07 1.20345e+07 2.40225e+07 4.30245e+07
step 90
1.54045e+07 1.10125e+07 1.20345e+07 2.40225e+07 4.30245e+07
1.16545e+07 1.10125e+07 1.20345e+07 2.40225e+07 4.30245e+07
1.10045e+07 1.10125e+07 1.20345e+07 2.40225e+07 4.30245e+07
1.10045e+07 1.10125e+07 1.20345e+07 2.40225e+07 4.30245e+07
...

如果所需精度为小数点后2位数。

如何以有效的方式执行此操作,并且内存使用率较低(也就是说,我不必将整个文件加载到内存中)。

最好是使用bash脚本的解决方案。

4 个答案:

答案 0 :(得分:1)

快速&amp;肮脏的解决方案,如果&#34;冗长&#34;部分数字是'e' ...

前面唯一一个长度超过2位数的序列
sed -i "s/\([0-9]\{2\}\)[0-9]*e/\1e/g" <filename>
  • "s - 搜索
  • / - 开始&#34;搜索&#34;术语
  • \( - 开始小组
  • [0-9] - 数字
  • \{2\} - ...其中两个(针对不同的输出精度编辑此内容)
  • \) - 结束组
  • [0-9]* - 后跟任意位数
  • e - 后跟'e'
  • / - 结束&#34;搜索&#34;术语,开始&#34;替换&#34;术语
  • \1 - 第一组的内容(两个第一位数字)
  • e - 以及'e'
  • / - 结束&#34;替换&#34;术语
  • g - 每行做任意次数(&#34;全球&#34;)

-i选项(GNU扩展名)执行替换文件内容,因此最好先使用-i进行尝试,以确保输出符合要求。

答案 1 :(得分:1)

$ sed 's/\(\...\)...e/\1e/g' < so.txt

step 80
1.10e+07 1.10e+07 1.20e+07 2.40e+07 4.30e+07
1.10e+07 1.10e+07 1.20e+07 2.40e+07 4.30e+07
1.10e+07 1.10e+07 1.20e+07 2.40e+07 4.30e+07
1.10e+07 1.10e+07 1.20e+07 2.40e+07 4.30e+07
step 90
1.54e+07 1.10e+07 1.20e+07 2.40e+07 4.30e+07
1.16e+07 1.10e+07 1.20e+07 2.40e+07 4.30e+07
1.10e+07 1.10e+07 1.20e+07 2.40e+07 4.30e+07
1.10e+07 1.10e+07 1.20e+07 2.40e+07 4.30e+07

答案 2 :(得分:1)

您可以使用Perl逐行读取文件,并使用sprintf()重新格式化数字:

perl -pe '!/^step/ && s/(\S+)/sprintf("%.2e", $1)/ge' file

答案 3 :(得分:0)

使用awk你可以做到:

awk 'NF==5{printf "%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n", $1, $2, $3, $4, $5; next}1' file

如果列数未知,请使用循环:

awk '!/^step/{for(i=1;i<=NF;i++) printf "%.2e%s", $i,i==NF?"\n":"\t";next}1' file