我正在努力调整一个脚本,该脚本循环遍历大量单独的文件(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
,但对于B)
它导出的情况7777780
。我认为我需要使用 printf 来指定输出的小数位数,但
'{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