Операторы управления

Простейшие операторы

exit

завершить выполнение программы;

next

перейти к следующей строке, управление на начало awk-программы;

break

выход из цикла;

continue

переход к следующей итерации;

Структурные операторы

if (условие) {операторы} [else {операторы}] while (условие) {операторы}

for (выражение; условие; выражение) {операторы} for (индекс in имя_массива) {операторы}

Структурные операторы в значительной степени аналогичны соответствующим операторам Си. В последнем случае для каждого индекса выполняется блок. Текстовые индексы рассматриваются в лексикографическом порядке.

Примеры

1) awk ' $4~/40/ {if($3<=1980) {print("Фамилия: " $1 ) M["40"]++}}

$4~/50/ {M["50"]++} END {for(i in M)

{print(" i =" i " M[" i "]=" M[i])}} ' f-awk

Результат:

Фамилия: Петров Фамилия: Сидоров i =40 M[40]=2

i =50 M[50]=1

2) awk ' BEGIN {ORS = " "}

{ for(k=NF; k>0; --k) {print $k} {print RS}

} ' f-awk | sed 's/^ //'

Результат:

50 1980 И.И. Иванов

40 1979 А.В. Петров

40 1979 С.К. Сидоров

60 1970 И.Х. Хведоров

Здесь, кроме изменения очередности полей в строке на противоположное (что делает цикл "for"), предварительно устанавливается выходной разделитель - пробел и весь результат предварительно выдается в одну строку, поэтому после обработки каждой строки выдается команда "print RS" для перевода выходной строки. Редактор "sed" подключен через конвейер, чтобы убрать возможные пробелы в начале строки. Существенная деталь. Если запустить лишь базовую структуру

awk '{ for(k=NF; k>0; --k) {print $k}}' f-awk

то все поля исходной таблицы с изменениями порядка внутри прежних строк получим вытянутыми в один столбец переводом строки:

50

1980

И.И.

Иванов

40

1979

А.В.

Петров

40

1979

С.К.

Сидоров

60

1970

И.Х.

Хведоров

Однако, если поставим ";" сразу после условия, т.е. сделаем пустое тело цикла, за пределы которого вынесен "print $k"

awk '{ for(k=NF; k>0; --k); {print $k}}' f-awk

то получим исходную таблицу

Иванов И.И. 1980 50 Петров А.В. 1979 40 Сидоров С.К. 1979 40 Хведоров И.Х. 1970 60

поскольку "$k" после выхода из цикла будет иметь значение "0", а "$0" - соответсвует всей строке в качестве значения(!), то "print $k" будет после каждого цикла печатать полные строки.

8. Ввод и вывод данных

В общем случае в команде awk может быть указано несколько файлов. Напомним форматы вызова команды:

awk [-Fc] 'prog.awk' [file ...] awk [-Fc] -f prog.awk [file ...]

^

Файлы обрабатываются последовательно в указанном порядке. Это можно использовать для "настройки" awk команды при обработке последующих файлов.

Пусть файл "f0" имеет вид:

60 Сидоров

А файл awk-программы "prim.awk" имеет вид:

FILENAME == "f0" { # если просматривается файл "f0" w1 = $2 # присваиваются значения переменным

w2 = $1 # w1 - Сидоров, w2 - 60

}

$1 == w1 { print ("фамилия: "$1)} # означенные переменные $4 == w2 { print ("годы: " $4)} # используются в

# селекторах

Тогда при вызове команды

awk -f prim.awk f0 f-awk

Результат:

фамилия: Сидоров годы: 60

То есть второе поле файла "f0" дает значение переменной "w1", а первое - "w2". Эти переменные используются в селекторах при обработке файла "f-awk".

Изменим программу в файле "f-awk":

FILENAME == "f0" { w1 = $2

w2 = $1 next

}

{ print ("фамилия: "$1); next} $4 == w2 { print ("годы: " $4)}

Результат:

фамилия: Иванов фамилия: Петров фамилия: Сидоров фамилия: Хведоров

Если исключить первый оператор "next", то в выходном файле появится дополнительно первая строка:

фамилия: 60

поскольку выбирается снова первое поле в певом файле ("f0"). Если исключить и второй "next", то в выходном файле появится дополнительно последняя строка:

годы: 60

которая ранее не выводилась, так как в предшествующий оператор " { print ("фамилия: "$1)}" заканчивал работу на ПОСЛЕДНЕЙ строке файла "f-awk", поэтому "next" пропускал последующую командную строку

$4 == w2 { print ("годы: " $4)}

И еще одна модификация в связи с вводом данных с терминала. Вызов команды будет:

awk -f prim.awk f0 f-awk

А файл "prim.awk" примет вид:

BEGIN { print ("Введите годы и фамилию: ")} FILENAME == "-" {

w1 = $2

w2 = $1 next

}

$1 == w1 { print ("фамилия: "$1); next} $4 == w2 { print ("годы: " $4)}

9. Встроенные функции

Встроенные функции:

sin (expr) cos (expr) exp (expr) log (expr) sqrt (expr) int (expr) length (s)

printf (fmt, ...)

substr (s, m, n)

getline () 0

index (s1, s2)

split (s, M, c)

Примеры.

синус expr косинус expr

возведение в степень expr натуральный логорифм expr извлечение корня expr целая часть числа

длина строки s

форматирование (аналогично Си) по спецификации fmt.

подстрока в n символов строки s, начинающаяся с m.

чтение следующей строки. конец файла, иначе 1.

номер позиции, с которой s1 совпадает с s2, иначе 0.

строка s разбивается элементы массива M по разделителю c (по умолчанию FS=" "); функция возвращает число полей.

1) awk ' BEGIN {FS = "."; a=0}

length ($1) > 8 {print (length ($1), $0);

a++

}

END {print ("Найдено строк: " a) }' f-awk

Результат:

9 Сидоров С.К. 1979 40

10 Хведоров И.Х. 1970 60 Найдено строк: 2

Здесь поля разделяются по ".", выбираются строки у которых длина первого поля больше 8- ми, и их длина "length ($1)" печатается перед строкой "$0".

2) awk '{i=split($0, Name, "."); for (j=1; j<=i; j++)

print ("Name[" j "]=" Name[j]) }' f-awk

Результат:

Name[1]=Иванов И Name[2]=И Name[3]= 1980 50 Name[1]=Петров А Name[2]=В Name[3]= 1979 40 Name[1]=Сидоров С Name[2]=К Name[3]= 1979 40 Name[1]=Хведоров И Name[2]=Х Name[3]= 1970 60

3) awk '{print (length)}' f-awk

Результат:

22

22

22

22

Поскольку все строки были выровнены пробелами, а в длине строки учитываются все символы до конца строки.

4) awk '{printf "%7.2f %s\n", NR, $0}' f-awk echo

awk '{printf "\t%s %s \n", NR, $0}' f-awk

Результат:

1.00 Иванов И.И. 1980 50

2.00 Петров А.В. 1979 40

3.00 Сидоров С.К. 1979 40

4.00 Хведоров И.Х. 1970 60

1 Иванов И.И. 1980 50

2 Петров А.В. 1979 40

3 Сидоров С.К. 1979 40

4 Хведоров И.Х. 1970 60

Краткая информация о редакторе sed

Редактор sed относится к текстовым редакторам потокового типа и не является интерактивным.

Редактор sed распознает следующие метасимволы регулярных выражений: ^ $ . * [ ] [^] \( \) \< \> \{n\} \{n,\} \{,m\} \{n,m\} &

Метасимвол & в команде s используется в строке замены для подстановки значения, которое соответствует регулярному выражению шаблона поиска.

Общий синтаксис вызова команд редактора sed следующий: sed [-n] [-e script]... [-f script_filename]... [filename...]

где

script - программа на языке sed;

script_filename - файл с программой на языке sed; filename - имя файла, в котором осуществляется поиск. Примеры использования команды:

sed -n '/regexp/p' filename (sed 's/regexp/repstr/' filename) или

cat filename | sed -n '/regexp/p' или

echo $varname | sed 's/regexp/repstr/' где

regexp - регулярное выражение (шаблон поиска); repstr - строка, замещаемая найденное выражение;

/ - символ-разделитель между командами редактора sed, regexp и repstr; filename - имя файла, в котором осуществляется поиск;

varname - имя переменной, в значении которой осуществляется поиск.

Символ-разделитель / можно заменить на любой другой символ, поставив перед ним обратную наклонную черту - \, например:

sed -n '\cREcp' filename

Полный синтаксис и подробное описание редактора sed можно получить выполнив команду man sed.

Краткая информация о метасимволах регулярных выражений редактора sed ^ якорный символ привязки регулярного выражения к началу строки $ якорный символ привязки регулярного выражения к концу строки

. соответствует одному любому символу * соответствует нулевому и более количеству повторений символа

[] соответствует одному из перечисленных в скобках символу [^] соответствует одному из НЕ перечисленных в скобках символу

\< якорный символ привязки регулярного выражения к началу слова \> якорный символ привязки регулярного выражения к концу слова \(\) запоминающие скобки & запоминает всю найденную строку

x\{m,n\} интервал повторения символа (m - минимум, n - максимум)

Полный синтаксис и подробное описание применения регулярных выражений можно получить выполнив команду man regexp и man regex.

Краткая информация о командах редактора sed

Соседние файлы в папке материалы к собеседованию