0.873000/0,234000 形式の数値を 87/23 形式に変更します。

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

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の間の対応する整数に置き換えます。それぞれはグローバル変数にするために変数で終わるため、g1行にサポートされている分岐の数に影響します。残念ながら、これは数字を四捨五入するのではなく切り捨てられます0.8388384

詳細:

  • s/)0\.0\(.\)[0-9]*/)\1/g
    0.00.00(例:または)で始まる数字を見つけて0.07小数点の2桁目に置き換えると、andの0.00代わりにandに0.07なります。 2番目の数字の後の任意の数字と一致し、その数字を捨てます(nullに置き換えます)。070007[0-9]*
  • s/)0\.\(..\)[0-9]*/)\1/g
    これは一般的なケースです。0.その後はnotなどに  0変更されます。0.83200083
  • 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

関連情報