Чому awk друкує весь рядок, коли я хочу, щоб він друкував змінну?


24

Коли я набираю:

echo "foo bar" | gawk -v var="content" '{print $var}'

Я очікую, що результат буде content. Чому саме так foo bar?


8
Спробуйте зняти $з $ var
taliezin

Справді. Я заплутався у синтаксисі bash ...
nicoco

Це гарне запитання, і хоча відповідь показує, що це $було неправильно, я не впевнений, що його слід закрити як друкарський помилок. Нещодавно я бачив декілька таких, можливо, нам потрібна канонічна
roaima

Відповіді:


45

Змінні посилаються на ім'я як у var, а не $varв awk. $nвідноситься до nго поля : $1для першого поля, $2для другого ... або всього запису за n== 0 ( $0є повним записом).

Вони не повинні бути буквальними числами. Ви можете використовувати $(1+1)або $variable. Якщо variableмістить 1, то $variableбуде першим полем. Зазвичай використовується $NFдля останнього поля ( NFце спеціальна змінна, яка містить кількість полів).

Якщо, як і у вашому прикладі, змінна не містить числа, це не число розуміється як 0.

Отже var="content"; print $var, це те саме, що var=0; print $var, і, таким чином, те саме print $0, що є надрукувати весь запис.

Що ви хочете тут:

echo "foo bar" | gawk -v var="content" '{print var}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.