次のファイル(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
2つの違いは太字で表示されています。これを行う方法を知っている人はいますか?たぶんawkを使うことができますか?
答え1
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
答え2
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
これには、同じトピックを変形した3つのサブコマンドがあります。それぞれは、aの)
後に少なくとも2つの小数点以下の0.00から1.00の間の小数点を見つけ、それを)
0から100の間の対応する整数に置き換えます。それぞれはグローバル変数にするために変数で終わるため、g
1行にサポートされている分岐の数に影響します。残念ながら、これは数字を四捨五入するのではなく切り捨てられます0.838
。83
84
詳細:
s/)0\.0\(.\)[0-9]*/)\1/g
0.0
0.00
(例:または)で始まる数字を見つけて0.07
小数点の2桁目に置き換えると、andの0.00
代わりにandに0.07
なります。 2番目の数字の後の任意の数字と一致し、その数字を捨てます(nullに置き換えます)。0
7
00
07
[0-9]*
s/)0\.\(..\)[0-9]*/)\1/g
これは一般的なケースです。0.
その後はnotなどに0
変更されます。0.832000
83
s/)1\.00[0-9]*/)100/g
その後、それを見つけて1.00
に変更します100
。これがデータに決して現れないと確信している場合は、このサブコマンドを省略できます。
0,234000
質問のタイトルで提案されているように、各サブコマンドで(小数点をカンマで)に変更する23
こともできます\.
。[,.]
答え3
$ cat test.txt
(AJirio:0.00207,(AJama:0.00176,(AJtok:0.00034,AJkago:0.00057)0.832000:0.00080)0.934000:0.00111)0.923000
$ awk -F\) '{for(i=NF-2;i<=NF;i++){split($i,arr,":");$i=sprintf("%2d:%s",arr[1]*100,arr[2])}}1' OFS=\) test.txt | sed "s/:$//"
(AJirio:0.00207,(AJama:0.00176,(AJtok:0.00034,AJkago:0.00057)83:0.00080)93:0.00111)92