Дефис и вертикальная линия в bash - PullRequest
2 голосов
/ 26 мая 2019

Я пытаюсь расшифровать следующий код:

awk '{print "aws s3 cp ###"$4" - | gunzip | awk -F $\"\\t\" '"'"'BEGIN {OFS = FS} {if ($287 == \"0\" && tolower($295)) print $11}'"'"' > "gensub(/.+\/(.+tsv\.gz)/,output_path"\\1.txt",$4)}'

Однако я не уверен в нескольких вещах:

1) Что делает "-". Я знаю "|" используется для трубопровода, но я действительно не уверен насчет «-», кроме как в контексте отрицания некоторой опции. Я попытался погуглить "ubuntu дефис / минус / тире", но ничего не вышло, связанное с этим

2) Я тоже не уверен насчет print "aws s3 cp ###"$4". Обычно он печатает строки, удовлетворяющие условиям if, но здесь он принимает командную строку aws, за которой следует $ 4, который, как я знаю, является индексом столбца

3) Кроме того, я знаю, что awk -F, за которым следует знак, будет обозначать знак как разделитель, но здесь знака нет. Я не понимаю поведение по умолчанию в этом случае.

1 Ответ

1 голос
/ 26 мая 2019

Это действительно ужасная командная строка.

1) Дефис является опцией команды aws s3 cp. Необычно видеть, что он использовался таким образом, но это означает, что местом назначения копии является STDOUT, и поэтому он попадает в gunzip. Гораздо чаще встречается дефис, представляющий STDIN для данных, передаваемых в команду.

2) print выводит команду aws s3 cp вместе со всем остальным конвейером (включая встроенный экземпляр другой команды AWK).

3) «Знак» для -F здесь - символ табуляции, использующий (неправильно) цитирование перевода Bash ($" "). Он должен был использовать цитирование ANSI Bash ($' '), которое позволяет интерпретировать экранирование обратной косой черты (\t представляет символ табуляции). В любом случае, это впустую, так как AWK может понять \t для -F без каких-либо специальных кавычек.

Эта переменная должна быть установлена ​​в другом месте: output_path

Конвейер, который выводится внешней командой AWK, должен быть передан в оболочку для выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...