2017-01-03 6 views
0

私は、別のプログラム(AFNI)からコマンドを実行しているbashを持っています。コマンド出力このような2つの数:出力の最後の数値にBash変数を設定する

70.0 13.670712

私は最後の#が(この場合は13.670712に)あるものは何でもなりますbashの変数を作成する必要があります。私はそれが最後の数字だけを印刷する方法を考え出しましたが、それを変数に設定するのに問題があります。これを行う最善の方法は何ですか? test="$(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]')"; echo "${test}" | awk '{print $2}'

答えて

2

だけpipe(|)コマンド出力awkへ:ここ

は13.670712を印刷したコードです。ここの例では、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 

(または)あなたはbash -ismでこれを行うために他の方法を探している場合、これは、これを実行する方法が最も簡単ですecho

echo "$test" 
13.670712 

を使用して、使用したとして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 

シェルAに関係なく動作するsetを使用して別のよりポータブルバージョン、利用可能です。

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

'read'ソリューションはかなり良いと慣用句です。私は 'set'を推奨しません。私は移植性を探しているなら、最初のものが最良の選択だろうと思っています(しかし、OPはBashを指定していますので、最も効率的です)。 –

+1

@gniourf_gniourf:それを感謝します!外部ユーティリティなしで可能な方法として提供することを望んでいた。しかし、私はこのような単純なユースケースのためにとにかく問題ではないと思います。 'set'を推奨しない理由は、フィールド分離と関係がありますか? – Inian

+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'を置き換えます実際には2つの数字を生成します。

区切られたフィールドの最後の値(または区切られたコマンドの出力)を取得する場合は、parameter expansionを使用できます。

$ 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 

そしてちょうど直接割り当てる:これはbashに完全に内部にある

$ 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 
関連する問題