пятница, 22 апреля 2011 г.

awk

Скриптовый язык поверх скриптового языка баша. Для работы с текстовыми файлами и входящими тектовыми потоками.
awk скрипт состоит из
шаблон {операция}

На месте шаблона могут быть выражения, шаблоны и их комбинации. Под шаблоном подразумевается регексп.


Входящий поток авк расматривает как матрицу из определенным к-вом строк, и NF количеством полей в текущей строке.

$0 -- так можно обратиться ко всей поточной строке.
$1..$n  -- так можно обратиться к нужному полю в поточной строке.
Поля разделяются разделителем FS, который по-умолчанию является пробелом и/или  табом.
Чтобы поставить новое значение нужно:

awk -Fc    "script"   file-for-scan
Где с- новый разделитель

Авк может получать несколькими способами данные для сканирования:
cat for_awk | awk '/Ура/ {print}'
awk '/Ура/ {print}' < for_awk
awk '/Ура/ {print}' for_awk

Примеры:
awk ' $3~/(7[0-9])$/ {print} ' for_awk
Если третий филд подойдет патерну распечатать его строку.

awk '$1=="Иванов" {print} ' for_awk
Если первый филд равен конкретному значению распечатать его строку.

awk '/^Ив|дор/  {print} ' for_awk
Если строка начинается с "Ив" или в ней содержится "дор", то вывести ее.

awk '$3 != $4 && $3 > 1970  {print} ' f-awk
Если третий филд не равен ветвертому и третий больше значения вывести эту строку.


Также тут характерные сишные числовые операции. Переменные не требуют обьявления, инициализируются по умолчанию 0 или путой строкой -- если это строка.
Конкатинация строк происходит пробелом

Есть два шаблона
BEGIN -- до начала сканирования файла
END -- послед начала сканирвания файла

есть также пердопределенные переменные.

Файл f-awk:
Иванов И.И.   1980  50
Петров А.В.   1979  40
Сидоров С.К.  1979  40
Хведоров И.Х. 1970  60

Команда со скриптом:
awk '{ s += $4 }
   {print("NR=" NR, "NF=" NF)}
  END {print ("FILENAME=" FILENAME)
   print ("Значение позиционной переменной" $4 "\"пусто\" \
после окончания просмотра)")
   print ("Суммарный возраст:" s)
   print ("Средний   возраст:" s/NR)}' f-awk

Результат:
NR=1 NF=4
NR=2 NF=4
NR=3 NF=4
NR=4 NF=4
FILENAME=f-awk
Значение позиционной переменной "пусто" после окончания просмотра)
Суммарный возраст:190
Средний   возраст:47.5

Хороший краткий но полный туториал http://www.lissyara.su/doc/programming/awk/

Комментариев нет:

Отправить комментарий