Использование awk с qsub и проблемы с цитатами - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь запустить скрипт, который будет отправлять несколько команд awk по следующим строкам:

qsub -l h_vmem=32G -l h_rt=04:00:00 "awk '{if (last != $10) close(last); print >> "/directory/working/"$10 ".txt"; last = $10}' /directory/working/working_file.txt"

Сама команда awk прекрасно работает при запуске в интерактивном сеансе, проблема в том, чтов сочетании с qsub он возвращает что-то вроде:

error opening awk '{if (last != 0) close(last); print >> '/directory/working: No such file or directory

Изначально я думал, что это можно решить, поставив всю команду awk в двойные кавычки (как я делал выше), но этотакже вернул ту же ошибку.Я понимаю, что это не работает из-за лишних двойных кавычек внутри команды awk. Но Насколько я знаю, мне нужны эти дополнительные двойные кавычки внутри команды.

Я пытался изменить его так, чтобы каждая цитата в первом наборе двойных кавычек была просто одинарнойцитаты, но это не сработало.Затем я попытался:

qsub -l h_vmem=32G -l h_rt=04:00:00 "$(awk ...)"

Но, похоже, это тоже не сработало (или, по крайней мере, после его отправки, оно не вернуло ошибку, но на самом деле не показывало.

Есть ли способ обойти это / какие-либо решения со всеми различными цитатами?

1 Ответ

1 голос
/ 20 марта 2019

Использование нескольких уровней цитирования может привести к ошибкам, поэтому их лучше избегать.

Похоже, что qsub ожидает либо имя файла скрипта, либо исполняемой программы, за которой следуют аргументы.Тем не менее, синтаксис отличается в двух случаях.См .: Отправка задания напрямую с указанием исполняемого файла в командной строке

qsub scriptfile

qsub -- program arg1 arg2 arg3 ...

Таким образом, простейшим решением, похоже, является не вложение кавычек, а добавление --:

qsub -l h_vmem=32G -l h_rt=04:00:00 -- awk '{if (last != $10) close(last); print >> "/directory/working/"$10 ".txt"; last = $10}' /directory/working/working_file.txt

Для более длинных командных строк может быть лучше сохранить сценарий в виде файла, где qsub сможет его найти, так что вам вообще не нужно беспокоиться о цитировании.


Если выВы должны вкладывать кавычки в других ситуациях, вы можете получить bash (v4.4 +), чтобы показать вам, что нужно:

raw=$(cat <<'EOD'
awk '{if (last != $10) close(last); print >> "/directory/working/"$10 ".txt"; last = $10}' /directory/working/working_file.txt
EOD
)
quoted="${raw@Q}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...