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)
'IT > 개발' 카테고리의 다른 글
Syntax error: "(" unexpected (0) | 2023.08.20 |
---|---|
[Java] Server IP와 Client IP를 조회하는 방법 A to Z(feat. virtualbox host-only network ip) (0) | 2023.08.20 |
[Java] Linux 명령 날리고 결과 값 리턴 받기 (0) | 2023.08.17 |
IT, 개발/JAVAJAVA 명령어 실행 & 실행 후 결과 받아오기(명령어 2개 이상 사용하기) (0) | 2023.08.17 |
Windows SQL Server 스크립트 생성 및 백업 알아보기 (0) | 2023.06.26 |