我有bash从另一个程序(AFNI)运行命令。该命令输出两个数字,如下所示:
70.0 13.670712
我需要创建一个bash变量,它将是最后一个#(在本例中为13.670712)。我已经弄清楚如何让它只打印最后一个数字,但我却无法将其设置为变量。这样做的最佳方式是什么?
以下是仅打印13.670712的代码:
test="$(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]')"; echo "${test}" | awk '{print $2}'
答案 0 :(得分:2)
只需pipe(|
)命令输出到awk
。在您的示例中,awk
从您之前命令的stdout
读取并打印出2nd
列,该列被默认的单个空格字符限制。
test="$(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]' | awk '{print $2}')"
printf "%s\n" "$test"
13.670712
(或)使用echo
echo "$test"
13.670712
这是最简单的方法,如果您正在寻找其他方法在bash
- ism中执行此操作,请使用read
命令作为process-substitution
read _ va2 < <(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]')
printf "%s\n" "$val2"
13.670712
使用set
的另一个更便携版本,无论可用的shell如何都可以使用。
set -- $(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]');
printf "%s\n" "$2"
13.670712
答案 1 :(得分:2)
您可以使用cut
进行打印以打印第二列:
$ echo "70.0 13.670712" | cut -d ' ' -f2
13.670712
并将其分配给command substitution的变量:
$ sc="$(echo '70.0 13.670712' | cut -d ' ' -f2)"
$ echo "$sc"
13.670712
只需用实际产生两个数字的命令替换echo '70.0 13.670712'
。
如果要获取某些分隔字段的最后一个值(或命令的分隔输出),可以使用parameter expansion。这完全是Bash内部的:
$ echo "$s"
$ echo ${s##*' '}
10
$ echo "$s2"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$ echo ${s2##*' '}
20
然后直接分配:
$ echo "$s2"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$ lf=${s2##*' '}
$ echo "$lf"
20