Это на самом деле в POSIX awk
(ссылка на POSIX 2008, предыдущие версии тоже были, я считаю). -v
описано в разделе « Параметры », другой способ - в разделе « Операнды ».
Существует разница между -v
передачей назначений в конце с именами файлов:
Приложение должно гарантировать, что аргумент присваивания находится в той же форме, что и операнд присваивания. Указанное присвоение переменной должно произойти до выполнения программы awk, включая действия, связанные с шаблонами BEGIN (если они есть). Несколько вхождений этой опции могут быть указаны.
- Смешано с именами файлов:
[...] Каждое такое присвоение переменной должно происходить непосредственно перед обработкой следующего файла , если таковой имеется. Таким образом, назначение перед первым аргументом файла должно выполняться после действий BEGIN (если они есть), тогда как назначение после последнего аргумента файла должно выполняться перед действиями END (если они есть). Если файловых аргументов нет, присваивания должны выполняться перед обработкой стандартного ввода.
Пример:
$ cat input
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
var=two input var=three input var=four
one
two
two
three
three
four