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

둘 사이의 차이점은 굵은 글씨로 표시되어 있습니다. 이 작업을 수행하는 방법을 아는 사람이 있나요? 어쩌면 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여기에는 동일한 주제를 변형한 세 가지 하위 명령이 있습니다 . 각각은 a )뒤에 최소 두 개의 소수 자릿수가 있는 0.00에서 1.00 사이의 소수점을 찾아 이를 )0에서 100 사이의 해당 정수로 대체합니다. 각각은 전역 변수로 만들기 위해 변수로 끝나므로 g한 줄당 지원되는 분기 수에 영향을 줍니다. 불행하게도 이는 숫자를 반올림하는 대신 잘려서 대신 0.838가 됩니다 .8384

세부 사항:

  • s/)0\.0\(.\)[0-9]*/)\1/g
    0.00.00(예: 또는 )로 시작하는 숫자를 찾아 0.07소수점 둘째 자리로 바꾸면 0.00and 대신 and 가 0.07됩니다 .   두 번째 숫자 뒤의 임의의 숫자와 일치하고 해당 숫자를 버립니다(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

관련 정보