Где можно начать с простых примеров AWK? - PullRequest
1 голос
/ 07 февраля 2009

Все мои коды не работают. Они должны печатать «он», «привет» и «5 \ n 3» соответственно:

awk -v e='he' {print $e}       // not working, why?
awk NF { print hello }
awk { print ARGV[5,3] }

Есть ли несколько простых примеров о AWK?

Ответы [ 5 ]

3 голосов
/ 07 февраля 2009

Во-первых, здравый смысл сценариев оболочки:

  • Всегда заключайте ваш скрипт в одинарные кавычки

Обратите внимание, что сценарий представляет собой один аргумент или имя файла с -f file.

Скрипт awk - это последовательность пар <pattern> <action>. Действие заключено в фигурные скобки «{}» для ясности и здравомыслия, опять же.

Как сказал Пакс, первый пример должен быть:

awk -v -e e='he' '{ print e }'

Второй пример непостижим - вы, вероятно, имели в виду:

awk '{ print "hello" }'

Переменная NF - это количество полей в строке. Вы можете получить awk для интерпретации

awk 'NF { print "hello" }'

если в строке ввода есть какие-либо данные (NF! = 0 или число полей не равно нулю), то выведите 'hello'.

Последний пример также непостижим; ARGV - это массив аргументов для awk, и командная строка не предоставила ни одного. Но это одномерный массив. Ваша нотация под-сценариев хочет обрабатывать ее как словарь Python или хэш Perl с двумя объединенными индексами. Вы в порядке - awk поддерживает ассоциативные массивы; но поскольку вы не добавили ничего в массив в ARGV [5,2], он ничего не напечатает.

3 голосов
/ 07 февраля 2009

Во-первых, вы не используете $ для переменных внутри awk, попробуйте вместо этого:

fury> echo | awk -v e='he' '{print e}'
he

Во-вторых, ваше условие NF означает NF! = 0, поэтому оно будет печататься только для непустых строк:

fury> echo | awk 'NF {print "hello"}'
fury> echo "7 8" | awk 'NF {print "hello"}'
hello

Я никогда не видел ваш синтаксис для третьего, ARGV - это одномерный массив, поэтому вы можете использовать:

fury> awk 'BEGIN {print ARGV[5]}' 1 2 3 4 5 6 7
5
fury> awk 'BEGIN {print ARGV[5] "\n" ARGV[3]}' 1 2 3 4 5 6 7
5
3

Примечание. Я использую блок BEGIN для третьего, иначе он попытается открыть и обработать 1, 2, 3, ... как файлы.

2 голосов
/ 07 февраля 2009

Попробуйте:

echo "hello" | awk ' {print $0} '
echo "hello" | awk ' {print $1} '

Обратите внимание, что $ 0 возвращает всю запись, а $ 1 - только первую запись; awk начинает свои счетчики с 1. Итак

echo "hello1 hello2 hello3" | awk ' {print $0} '

возвращает hello1 hello2 hello3. Пока

echo "hello1 hello2 hello3" | awk ' {print $3} '

вернет привет3

Мне нравится Учебное пособие по awk.

1 голос
/ 31 августа 2009

Кроме того, много полезной информации и учебных пособий на http://awk.info

1 голос
/ 07 февраля 2009

Я использую этот сайт. Книга O'Reilly Sed & Awk также хороша.

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