Text-Processing
將此表格中的數字:0.873000 / 0,234000 更改為此表格:87 / 23
從像這樣的文件(分支支持在 0 到 1 之間的系統發育樹):
(AJirio: 0.00207, (AJama: 0.00176, (AJtok: 0.00034, AJkago: 0.00057) **0.832000** : 0.00080) **0.934000** : 0.00111) **0.923000**
我需要得到這個(分支支持是0到100之間的整數的系統發育樹):
(AJirio: 0.00207, (AJama: 0.00176, (AJtok: 0.00034, AJkago: 0.00057) **83** : 0.00080) **93** : 0.00111) **92**
兩者之間的差異以粗體顯示。有誰知道該怎麼做?也許用awk?
如果所有數據看起來都像樣本數據,這很容易
sed
:sed -e 's/)0\.0\(.\)[0-9]*/)\1/g' -e 's/)0\.\(..\)[0-9]*/)\1/g' -e 's/)1\.00[0-9]*/)100/g' file
這有三個
-e
子命令,它們是同一主題的變體。每個都查找 a)
後跟 0.00 到 1.00 之間的十進制數,至少有兩個小數位,並將其替換為 a)
後跟 0 到 100 之間的相應整數。每個都g
以使其全域結尾,因此它影響任何每條線上的支路支座數。不幸的是,這會截斷數字而不是四捨五入,因此0.838
變成83
而不是84
.細節:
s/)0\.0\(.\)[0-9]*/)\1/g
查找以
0.0
(例如,0.00
or0.07
) 開頭的數字並將其替換為僅第二個十進制數字,因此0.00
and0.07
變為0
and7
而不是00
and07
。[0-9]*
匹配第二個數字之後的任意數字並丟棄它們(通過將它們替換為空)。
s/)0\.\(..\)[0-9]*/)\1/g
這是一般情況:
0.
後跟除 a 之外的其他內容0
。這將更0.832000
改為83
等。
s/)1\.00[0-9]*/)100/g
這將查找
1.00
並將其更改為100
. 如果您確定這永遠不會出現在您的數據中,您可以不使用此子命令。如果,正如您在問題標題中所建議的那樣,您還希望能夠在每個子命令中將
0,234000
(用逗號作為小數點)更改為23
,更改\.
為。[,.]
使用 awk 使用以下命令從文件中提取所需的內容(
temp.txt
是輸入文件):awk -F ")" '{print $1 ")" substr($2,3,2) substr($2,9) ")" substr($3,3,2) substr($3,9) ")" substr($4,3,2) }' temp.txt