나는 여러 개의 개별 파일(subj_id)을 반복하고 지정된 줄에 $4 값을 인쇄하는 스크립트를 조정하는 중입니다.
텍스트 파일에 줄이 포함되어 있습니다.
# Measure Brain, ICV, Brain Volume, 1118718.609121, mm^3
내 스크립트에는 숫자 1118718을 내보내는 다음 줄이 포함되어 있습니다.
printf "%g," `cat ${subj_id}/stats/aseg.stats | grep ICV | awk -F, '{print $4}'` > BrainVol.csv
내 값은 내보낼 A) 666666.012345
때 B) 7777777.012345
스크립트가 A)
잘 실행되지만 내보내는 경우 666666
에는 그렇지 않습니다 . 출력의 소수 자릿수를 지정하려면 printf를 사용해야 한다고 생각했는데 작동하지 않습니다.B)
7777780
'{printf "%.2f\n",$4}'
죄송합니다. 너무 기본적이지만 이 파이프라인에 소수 지정자를 포함하는 올바른 순서는 무엇입니까(문제인 경우).
이것은 bash 스크립트입니다. 저는 Mac OS X 10.7.5를 실행하고 있습니다.
어떤 도움이라도 대단히 감사하겠습니다.
답변1
다음은 나에게 효과적이었습니다.
awk -F, '/ICV/ {printf "%.2f\n", $4}' ${subj_id}/stats/aseg.stats
다음 소스를 사용하는 경우:
# Measure Brain, ICV, Brain Volume, 1118718.609121, mm^3
# Measure Brain, ICV, Brain Volume, 7777777.012345, mm^3
# Measure Brain, ICV, Brain Volume, 666666.012345, mm^3
다음과 같은 결과가 나타납니다.
1118718.61
7777777.01
666666.01
@glennjackman이 지적했듯이 다음을 수행하여 줄의 어느 곳에서나 패턴을 일치시키는 대신 예상 필드가 우리가 원하는 정확한 문자열인지 확인하여 일치를 보다 구체적으로 만들 수 있습니다.
awk -F, '$2 == " ICV" {printf "%.2f\n", $4}' ${subj_id}/stats/aseg.stats
또는 공백을 유연하게 사용하려면 해당 필드에 패턴을 일치시키면 됩니다.
awk -F, '$2 == /^[[:space:]]*ICV[[:space:]]*$/ {printf "%.2f\n", $4}' ${subj_id}/stats/aseg.stats