![在巨大的 ASCII 文件中添加数字](https://linux22.com/image/65856/%E5%9C%A8%E5%B7%A8%E5%A4%A7%E7%9A%84%20ASCII%20%E6%96%87%E4%BB%B6%E4%B8%AD%E6%B7%BB%E5%8A%A0%E6%95%B0%E5%AD%97.png)
背景:
(1) 这是我的 ascii 文件的一部分的屏幕截图(超过 600Mb):
(1.1) 这是部分代码:
0, 0, 0, 0, 0, 0, 0, 0, 3.043678e-05, 3.661498e-05, 2.070347e-05,
2.47175e-05, 1.49877e-05, 3.031176e-05, 2.12128e-05, 2.817522e-05,
1.802658e-05, 7.192285e-06, 8.467806e-06, 2.047874e-05, 9.621194e-05,
4.467542e-05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.000421869,
0.0003081213, 0.0001938675, 8.70334e-05, 0.0002973858, 0.0003385935,
8.763598e-05, 2.743326e-05, 0, 0.0001043894, 3.409237e-05, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.503832e-05, 1.433673e-05, 2.557402e-05,
3.081098e-05, 4.044465e-05, 2.480817e-05, 2.681778e-05, 1.533265e-05,
2.3156e-05, 3.193812e-05, 5.325314e-05, 1.639066e-05, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 2.259782e-05, 0.0004197799, 2.65868e-05, 0.0002485498,
3.485129e-05, 2.454055e-05, 0.0002096856, 0.0001910835, 1.969936e-05,
2.974743e-05, 8.983165e-05, 0.0004263787, 0.0004444561, 0.000241368, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
(2) 每个红色矩形包含 74 个元素。
(3) 我想为每个非零条目添加一个数字,例如 0.001。
我的想法:
(1) 我的朋友告诉我这/perl
可以帮助完成这项任务,但我对这个编程脚本很陌生。
(2) 我猜策略是读取每个数字并
(i) if it is a zero, then neglect it; or,
(ii) if it is non-zero, then add 0.001 to this number and replace this number.
(3)我担心的是:
是否/perl
能够读取科学记数法中的数字(即1.303637e-05确实等于0.00001303637)?
答案1
以下应该有效:
perl -pe 's/([0-9.e-]+)/$1 == 0 ? $1 : .001 + $1/ge' < input.txt > output.txt
-p
逐行处理文件s/patern/replacement/
是一个替代。[0-9.e-]+
匹配一个或多个给定字符,即数字()
记住每个数字$1
/g
全局应用替换,即每行根据需要多次应用替换/e
将替换评估为代码condition ? then : else
是“三元运算符”:如果条件为真($1 == 0
即记住的数字等于0),则返回该数字,否则添加0.001。
答案2
如果您不介意所有非零数字都采用科学记数法形式,请尝试:
perl -F, -anle '
for (@F) {$_=sprintf " %e",$_+0.0001 if $_+0}
print join ",", @F
' file