Maria
Maria

Reputation: 1297

Setting Bash variable to last number in output

I have bash running a command from another program (AFNI). The command outputs two numbers, like this:

70.0 13.670712

I need to make a bash variable that will be whatever the last # is (in this case 13.670712). I've figured out how to make it print only the last number, but I'm having trouble setting it to be a variable. What is the best way to do this?

Here is the code that prints only 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}'

Upvotes: 0

Views: 78

Answers (2)

dawg
dawg

Reputation: 103754

You can use cut to print to print the second column:

$ echo "70.0 13.670712" | cut  -d ' ' -f2
13.670712

And assign that to a variable with command substitution:

$ sc="$(echo '70.0 13.670712' | cut  -d ' ' -f2)"
$ echo "$sc"
13.670712

Just replace echo '70.0 13.670712' with the command that is actually producing the two numbers.

If you want to grab the last value of some delimited field (or delimited output from a command), you can use parameter expansion. This is completely internal to 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

And then just assign directly:

$ 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

Upvotes: 2

Inian
Inian

Reputation: 85550

Just pipe(|) the command output to awk. Here in your example, awk reads from stdout of your previous command and prints the 2nd column de-limited by the default single white-space character.

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

(or) using echo

echo "$test"
13.670712

This is the simplest of the ways to do this, if you are looking for other ways to do this in bash-ism, use read command as using 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

Another more portable version using set, which will work irrespective of the shell available.

set -- $(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]');
printf "%s\n" "$2"
13.670712

Upvotes: 2

Related Questions