awk
не является оболочкой. awk
имеет собственную грамматику, синтаксис и семантику. ${1}
не является синтаксически правильным awk
кодом, в то время как $1
и $"1"
являются (и они эквивалентны вawk
). В awk
это не замены.
С помощью awk
$1
относится к первому полю текущей входной записи, а $0
относится ко всей входной записи, в то время как в оболочке $1
относится к первому позиционному параметру (обычно первый аргумент в командной строке сценария или функции )и $0
обычно относится к имени текущей оболочки или сценария оболочки.
Переменные оболочки и awk
переменные также полностью разделены. Вот почему awk
имеет флаг командной строки -v
для установки своих переменных, если вам нужно «импортировать» значение из оболочки в ваш скрипт awk
:
$ awk -v var="$var" '{...}'
Вы также можете указать awk
скрипту значение переменной оболочки, как это:
$ awk '{...}' var="$var"
Это почти то же самое, что и с -v
, за исключением того, что переменная var
будет пустой в любом BEGIN
блоке. Блок BEGIN
выполняется до просмотра входных данных, и переменная устанавливается после выполнения такого блока.
Вы также можете
$ awk '{...}' var="$value1" file1 var="$value2" file2
Это приводит к тому, что переменная var
получает значение переменной оболочки $value1
непосредственно перед обработкой file1
, а затем значение переменной оболочки $value2
непосредственно перед обработкой file2
.
Если какой-либо файл имеет имя var="$value1"
в последнем примере (, например var="42"
, что является вполне допустимым именем файла Unix ), этот файл не . Кроме того, если шаблон подстановки имени файла оболочки в командной строке выбирает файл, имя которого выглядит как присвоение переменной, это присвоение будет активным в сценарии awk
.
Такая глупая ошибка. У меня было 1 *
лишних. Вместо * * * * 6
я ввел * * * * * 6
.