2017-01-03 2 views
0

У меня есть команда bash с другой программой (AFNI). Команда выводит два числа, например:Установка переменной Bash на последнее число на выходе

70.0 13.670712

мне нужно сделать переменный Баш, которая будет независимо от последнего # есть (в этом случае 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}'

ответ

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 изм, используют 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, который будет работать независимо от панциря модели шириной.

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, поэтому мы можем безопасно идти с решением 'read', что было бы наиболее эффективным). –

+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' с командой, которая является фактически производя два числа.

Если вы хотите получить последнее значение некоторого поля с разделителями (или ограниченный вывод из команды), вы можете использовать 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 
Смежные вопросы