Я делаю несколько ярлыков для своей учетной записи в вычислительном кластере. Когда я отправляю работу, система присваивает мой расчет идентификатору работы (JOBID). Чтобы перечислить все мои вычисления, я создал псевдоним
alias j="queue -u myuser-ID"
, который выдает результат, похожий на
JOBID NAME USER ST TIME
13716868 job_samp myuserid R 2:02:55
Затем система создает временный каталог с именем job.JOBID, в котором выходные файлы хранятся. Чтобы добраться до этого каталога, я написал функцию:
jj() { cd ~/many/many/files/job."$1"; }
, которая переводит меня во временный файл с помощью команды «job JOBID». Чтобы сохранить еще несколько нажатий клавиш, я хочу написать другую функцию, которая берет указанный JOBID по моему псевдониму «j» и переносит меня во временный файл. Когда у меня есть только одна работа, работает следующая функция
tt() { r=$(j | awk 'FNR>=2&&NR {print $1}'); jj $r; }
, и команда 'tt' переносит меня в этот файл. Однако, если у меня есть более одного вычисления (что в большинстве случаев), последняя функция бесполезна, поскольку она всегда приведет меня к первой работе в списке. Я пытаюсь назначить переменную биту FNR функции 'tt', чтобы при вводе, скажем, 'tt 3', я попадал в каталог третьего задания. Я попытался использовать опцию -v, как в
tt() { r=$(j | awk -v 'FNR=$2&&NR {print $1}'); jj $r; }
, но я получаю сообщение о том, что 'FNR' не является подходящей переменной. Как я могу сделать эту работу?
Заранее спасибо!
Awkk -v
аргумент берет a name=value
пара, позволяя Вам использовать name
как переменная в Вашей awk программе. Так
tt() { r=$(j | awk -v id="$2" 'FNR=id && NR {print $1}'); jj $r; }
(TBH я не уверен почему && NR
необходимо здесь, или почему Вы различаете NR
и FNR
когда Вы только передаете единственный вход (stdin) awk.)