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