我有以下格式的大量大文件
<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脚本的解决方案。
答案 0 :(得分:1)
快速&amp;肮脏的解决方案,如果&#34;冗长&#34;部分数字是'e'
...
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