sed & awk / sed & awk: 2.5 Совместное использование sed и awk

Оглавление
← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

В UNIX пайп может быть использован для пропуска вывода из одной программы в следующую программу. Давайте посмотрим несколько примеров, которые объединяют sed и awk для вывода отчета. Sed скрипт заменит почтовую аббревиатуру штата на полное имя штата, скрипт nameState является достаточно полным и будет использован повторно:

r0mk 01.10.12 в 10:04

0

$ cat nameState

r0mk 01.10.12 в 10:04

0

s/ CA/, California/

r0mk 01.10.12 в 10:04

0

s/ MA/, Massachusetts/

r0mk 01.10.12 в 10:04

0

s/ OK/, Oklahoma/

r0mk 01.10.12 в 10:04

0

s/ PA/, Pennsylvania/

r0mk 01.10.12 в 10:05

0

s/ VA/, Virginia/

r0mk 01.10.12 в 10:05

0

Конечно Вы хотите обрабатывать все штаты, а не тоглько 5, и если Вы запустите его на документе, который отличается от списка рассылки, Вам следует убедиться, что он не делает ненужных замен.

r0mk 01.10.12 в 10:06

0

Вывод этой программы использует на входе список, так, как мы уже рассматривали раньше. В следующем примере вывод обрабатывается скриптом nameState и черзе пайп передается программе awk, которая извлекает имя штата из каждой записи.

r0mk 01.10.12 в 10:08

0

$ sed -f nameState list | awk -F, '{ print $4 }'

r0mk 01.10.12 в 10:09

0

Massachusetts

r0mk 01.10.12 в 10:09

0

Virginia

r0mk 01.10.12 в 10:09

0

Oklahoma

r0mk 01.10.12 в 10:09

0

Pennsylvania

r0mk 01.10.12 в 10:09

0

Massachusetts

r0mk 01.10.12 в 10:09

0

Virginia

r0mk 01.10.12 в 10:10

0

California

r0mk 01.10.12 в 10:10

0

Massachusetts

r0mk 01.10.12 в 10:10

0

Программа awk обрабатывает вывод, предоставленный sed скриптом. Запомните, что sed скрипт заменяет аббревиатуру с запятой и полное имя штата. Фактически, он разделяет третье поле, содержащее город и штат на два поля. $4 указывает на четвертое поле.

r0mk 01.10.12 в 10:14

0

Все что бы делаем, можно полность реализовать в sed, но возможно с большими трудностями и менее основательно. Так же, поскольку awk позволяет Вам строку на шаблон, Вы можете достичь этого результата полностью на awk скрипте.

r0mk 02.10.12 в 17:39

0

Пока результат этой програмы не очень применим, его стоит пропустить через sort | uniq -c, которые отсортируют штаты в алфавитном порядке с нумерацией на каждой строке.

r0mk 02.10.12 в 17:40

0

Сейчас мы сделаем кое что более интерестное. Мы хотим предоставить отчет, отсортированный по имени штата и список имен людей проживающих в штате. Следующий пример показывает программу byState.

r0mk 02.10.12 в 17:42

0

#! /bin/sh

r0mk 02.10.12 в 17:42

0

awk -F, '{

r0mk 02.10.12 в 17:42

0

print $4 ", " $0

r0mk 02.10.12 в 17:43

0

}' $* |

r0mk 02.10.12 в 17:43

0

sort |

r0mk 02.10.12 в 17:43

0

awk -F, '

r0mk 02.10.12 в 17:43

0

$1 == LastState {

r0mk 02.10.12 в 17:43

0

print "\t" $2

r0mk 02.10.12 в 17:43

0

}

r0mk 02.10.12 в 17:44

0

$1 != LastState {

r0mk 02.10.12 в 17:44

0

LastState = $1

r0mk 02.10.12 в 17:44

0

print $1

r0mk 02.10.12 в 17:44

0

}'

r0mk 02.10.12 в 17:44

0

Этот шелл скрипт содержит три части. Программа вызывает awk и придоставляет входные данные для программы sort, и затем вызывает awk снова для проверки отсортированных входных данных и разделения если имя штата является текущей записью так же как в прошлой записи. Давайте посмотрим скрипт в работе:

r0mk 02.10.12 в 17:47

0

$ sed -f nameState list | byState

r0mk 02.10.12 в 17:47

0

California

r0mk 02.10.12 в 17:48

0

Amy Wilde

r0mk 02.10.12 в 17:48

0

Massachusetts

r0mk 02.10.12 в 17:48

0

Eric Adams

r0mk 02.10.12 в 17:48

0

John Daggett

r0mk 02.10.12 в 17:48

0

Sal Carpenter

r0mk 02.10.12 в 17:48

0

Oklahoma

r0mk 02.10.12 в 17:48

0

Orville Thomas

r0mk 02.10.12 в 17:49

0

Pennsylvania

r0mk 02.10.12 в 17:49

0

Terry Kalkas

r0mk 02.10.12 в 17:49

0

Virginia

r0mk 02.10.12 в 17:49

0

Alice Ford

r0mk 02.10.12 в 17:49

0

Hubert Sims

r0mk 02.10.12 в 17:49

0
Минутку...

Следующая страница →