Awk
在一個巨大的 ASCII 文件中添加一個數字
背景:
(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)?
以下應該有效:
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。