Если присвоение переменной задано как файловый операнд в командной строке скрипта awk
, это присвоение будет выполнено, когда awk
дойдет до этой точки в использовании файловых операндов.
Пример:
awk -f script.awk a=1 file1 file2 a=2 file3 a=3 file4
Здесь для переменной awk
a
будет установлено значение 1
перед чтением file1
. Переменная сохранит это значение (, если оно не будет изменено программой awk
)до тех пор, пока файл file2
не будет прочитан. Затем устанавливается значение 2
и т. д.
Это означает, что ваша командная строка правильно устанавливает переменную ID
в 4
перед чтением text.sql
.
Разница между -v ID=4
и этим заключается в том, что ID
не будет установлен ни в одном блоке BEGIN
. Использование -v ID=4
устанавливает ID
в 4
, и будет доступно в блоках BEGIN
.
Еще одна проблема с вашим кодом заключается в том, что вы используете ID
как буквальную строку в
if ($1 ~/--/ && $2 ~/^ID/){
То есть вы проверяете, начинается ли второе поле со строки ID
.
Также кажется, что вы ожидаете, что ваш цикл while
зациклится на строках файла. Цикл чтения строк -по -уже встроен в способ работы awk
, и очень редко требуется его явное описание.
Вместо этого
$1 == "--" && $2 == ID { getline; print }
Это будет использовать сравнение строк (не соответствует регулярному выражению )для проверки того, является ли первое поле с разделителями пробелами -в текущей строке строкой --
и является ли второе такое поле значением переменная ID
. Если это так, следующая строка ввода читается и печатается.
Чтобы вместо этого использовать регулярные выражения,
$0 ~ "^-- " ID "$" { getline; print }
Это будет соответствовать каждой строке, которая начинается с двойного дефиса и одиночного пробела, за которым следует значение ID
, а конец строки($
соответствует концу строки ). Строка после совпадающей строки будет напечатана.
В дополнение к «использованию -n1
», упомянутому в первом ответе, ваша оболочка могла иметь встроенную -версию некоторых команд. Если команда вызывается из другой программы (, например, из xargs
), она вызовет внешнюю программу вместо встроенной -версии оболочки.
В частности, printf
встроен в Bash и несколько других оболочек, а встроенная в Bash -версия будет повторять формат столько раз, сколько необходимо для использования всех аргументов.
Например, используя встроенную версию -Bash,
printf '%s and %s\n' How now brown cow
выведет 2 строки, тогда как
/usr/bin/printf '%s and %s\n' How now brown cow
может жаловаться, что у него слишком много аргументов, в зависимости от установленной версии.
Как правило, я бы избегал xargs
.
Большинство примеров, которые вы найдете в Интернете, ненадежны. -Они неожиданно сломаются, если среда не будет соответствовать предположениям человека, написавшего код.
Даже в примере, приведенном в этом вопросе, есть ошибка :он использует find
... -print0
, но затем используетxargs
без-0
.
Кроме того, большинство применений xargs
не нужны. В частности, когда он используется в сочетании с find
, более надежным и менее подверженным ошибкам -использование выражения -exec
внутри find
.
Приведенный пример можно заменить на:
find. -type f -exec md5sum {} +