IT/개발

[NM7] grep과 awk를 이용한 nonmem의 xml 파일에서 결과값 추출하기

알콩달콩아빠 2023. 8. 17. 19:54
728x90
반응형

NONMEM 7 부터는 결과값을 xml 파일로 저장해준다.

이를 활용하면 objective function value, elapsed time 등의 수치를 쉽게 추출할 수 있다.

Linux bash, grep, awk 등에 대해서는 http://bahndal.egloos.com/category/%EB%A6%AC%EB%88%85%EC%8A%A4%20bash%20script 사이트에 잘 정리되어 있다.

 

 

먼저 결과 파일명이 FO.xml 인 경우, grep을 이용해서 total_cputime 값을 추출해보자.

 

$ grep 'nm:total_cputime' FO.xml
<nm:total_cputime>0.124</nm:total_cputime>

 

grep을 이용하면 해당 검색어가 있는 줄을 통째로 추출해줌을 알 수 있다.

여기에 awk를 이용해서 결과값만 뽑아내보자.

 

$ grep 'nm:total_cputime' FO.xml | awk -F">" '{print $2}'
0.124</nm:total_cputime

 

awk의 -F 옵션 뒤에 나오는 ">"은 구분자를 의미한다. 그리고 print $2 는 구분자를 기준으로 2번째 값을 출력하라는 의미이다. ( 만약 print $0으로 하면 전체를 출력한다.)

그러나 아직 뒷부분이 남아있다. 아래와 같이 awk를 한번 더 적용하자.

 

$ grep 'nm:total_cputime' FO.xml | awk -F">" '{print $2}' | awk -F"<" '{print $1}'
0.124

 

이제야 결과값을 정확하게 추출하였다.

꼭 이렇게 awk를 두 번 써야 할까? 설마.... 역시 찾아보니 답이 있다.

구분자로 2가지를 동시에 적용할 수 있었다.

 

$ grep 'nm:total_cputime' FO.xml | awk -F"<|>" '{print $3}'
0.124

 

또는

$ awk -F '[<>]' '/nm:total_cputime/{print $3}' FO.xml
0.124

 

그러면 이 값을 텍스트 파일에 저장해보자.

 

$ grep 'nm:total_cputime' FO.xml | awk -F"<|>" '{print $3}' > result.txt
$ cat result.txt
0.124

 

오 잘 된다.

 

마지막 부분의 > result.txt 대신에 >> result.txt 로 하면 결과값을 누적하여 저장하게 된다.

 

$ grep 'nm:total_cputime' FO.xml | awk -F"<|>" '{print $3}' >> result.txt
$ cat result.txt
0.124

0.124

 

XML 값을 추출할 때 잘 이용하면 편할 것 같다.

 

 

추가 1. 이런 식으로 시간을 함께 기록할 수도 있다.

$ awk -F '[<>]' '/nm:total_cputime/{print "'`date +%k:%M`'", $3}' FO.xml >> result.txt
$ cat result.txt
0.124

0.124

13:27 0.124

 

추가 2. 이런 식으로 날짜와 시간을 함께 기록할 수도 있다.

$ awk -F '[<>]' '/nm:total_cputime/{print "'`date '+%F'`'", "'`date '+%k:%M'`'", $3}' FO.xml >> result.txt
$ cat result.txt
0.124

0.124

13:27 0.124
2017-09-17 13:41 0.124

 

추가 3. NONMEM에서 xml 자료만 별도로 추출해서 txt 파일을 만들어주는 nmfe73 실행파일을 여기에 첨부한다.

변경되는 내용은 아래와 같다. (nmfe73의 375줄째부터 기재함. 변경된 부분은 빨간표시함)

cat $2 OUTPUT >trash.tmp
mv trash.tmp $2
echo Stop Time: >>$2
date '+%F %r' >>$2
awk -F '[<>]' '/nm:total_cputime/{print "'`date '+%F'`'", "'`date '+%k:%M'`'", $3}' FO.xml >> result.txt 

위 코드를 간략히 설명하자면, FO.xml 파일에서 cputime을 추출하여 result.txt 파일에 저장하는 것이다.

참고로 xml 파일은 control 파일명을 따른다. 예를들어 control file명이 FO.CTL이면 FO.xml 인 것이다. (result file명을 따르지 않음)

 

출처 : [NM7] grep과 awk를 이용한 nonmem의 xml 파일에서 결과값 추출하기 : 네이버 블로그 (naver.com)

728x90
반응형