1. 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)}

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

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

sin (expr)

синус expr

cos (expr)

косинус expr

exp (expr)

возведение в степень expr

log (expr)

натуральный логорифм expr

sqrt (expr)

извлечение корня expr

int (expr)

целая часть числа

length (s)

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

printf (fmt, ...)

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

substr (s, m, n)

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

getline ()

чтение следующей строки.

0

конец файла, иначе 1.

index (s1, s2)

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

split (s, M, c)

строка 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

a\ добавляет одну или более строк текста к текущей строке

c\ заменяет текст в текущей строке

d удаляет строки

i\ вставляет текст перед текущей строкой

h копирует содержимое буфера редактирования в буфер хранения

H добавляет содержимое буфера редактирования в буфер хранения

g копирует содержимое буфера хранения в буфер редактирования

G добавляет содержимое буфера хранения в буфер редактирования

l вывод непечатных символов

p вывод строк

n читает следующую строку и применяет к ней следующую команду

q выход из редактора sed

r чтение строк из указанного файла

! все строки, не соответствующие указанному диапазону

s подстановка указанной строки вместо искомого текста

Флаги команды постановки

g подстановка вместо каждого искомого вхождения в строке

p вывод строк

w вывод строк в указанный файл

x поменять местами содержимое буферов хранения и редактирования

y трансляция символов (не допускает использования метасимволов)

При множественном применении команд или вложенной адресации диапазонов их группирование осуществляется с помощью фигурных скобок {}. При этом каждая команда должна находиться в отдельной строке, либо заканчиваться символом ; (точка с запятой).

sort — UNIX утилита, выводящая сортированное слияние указанных файлов на стандартный вывод с использованием установленной в среде локали.

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