sed & awk / sed & awk: 2.5 Совместное использование sed и awk
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
В UNIX пайп может быть использован для пропуска вывода из одной программы в следующую программу. Давайте посмотрим несколько примеров, которые объединяют sed и awk для вывода отчета. Sed скрипт заменит почтовую аббревиатуру штата на полное имя штата, скрипт nameState является достаточно полным и будет использован повторно: r0mk 01.10.12 в 10:04 |
|
|
$ cat nameState r0mk 01.10.12 в 10:04 |
||
|
s/ CA/, California/ r0mk 01.10.12 в 10:04 |
||
|
s/ MA/, Massachusetts/ r0mk 01.10.12 в 10:04 |
||
|
s/ OK/, Oklahoma/ r0mk 01.10.12 в 10:04 |
||
|
s/ PA/, Pennsylvania/ r0mk 01.10.12 в 10:05 |
||
|
s/ VA/, Virginia/ r0mk 01.10.12 в 10:05 |
||
|
Конечно Вы хотите обрабатывать все штаты, а не тоглько 5, и если Вы запустите его на документе, который отличается от списка рассылки, Вам следует убедиться, что он не делает ненужных замен. r0mk 01.10.12 в 10:06 |
||
|
Вывод этой программы использует на входе список, так, как мы уже рассматривали раньше. В следующем примере вывод обрабатывается скриптом nameState и черзе пайп передается программе awk, которая извлекает имя штата из каждой записи. r0mk 01.10.12 в 10:08 |
||
|
$ sed -f nameState list | awk -F, '{ print $4 }' r0mk 01.10.12 в 10:09 |
||
|
Massachusetts r0mk 01.10.12 в 10:09 |
||
|
Virginia r0mk 01.10.12 в 10:09 |
||
|
Oklahoma r0mk 01.10.12 в 10:09 |
||
|
Pennsylvania r0mk 01.10.12 в 10:09 |
||
|
Massachusetts r0mk 01.10.12 в 10:09 |
||
|
Virginia r0mk 01.10.12 в 10:10 |
||
|
California r0mk 01.10.12 в 10:10 |
||
|
Massachusetts r0mk 01.10.12 в 10:10 |
||
|
Программа awk обрабатывает вывод, предоставленный sed скриптом. Запомните, что sed скрипт заменяет аббревиатуру с запятой и полное имя штата. Фактически, он разделяет третье поле, содержащее город и штат на два поля. $4 указывает на четвертое поле. r0mk 01.10.12 в 10:14 |
||
|
Все что бы делаем, можно полность реализовать в sed, но возможно с большими трудностями и менее основательно. Так же, поскольку awk позволяет Вам строку на шаблон, Вы можете достичь этого результата полностью на awk скрипте. r0mk 02.10.12 в 17:39 |
||
|
Пока результат этой програмы не очень применим, его стоит пропустить через sort | uniq -c, которые отсортируют штаты в алфавитном порядке с нумерацией на каждой строке. r0mk 02.10.12 в 17:40 |
||
|
Сейчас мы сделаем кое что более интерестное. Мы хотим предоставить отчет, отсортированный по имени штата и список имен людей проживающих в штате. Следующий пример показывает программу byState. r0mk 02.10.12 в 17:42 |
||
|
#! /bin/sh r0mk 02.10.12 в 17:42 |
||
|
awk -F, '{ r0mk 02.10.12 в 17:42 |
||
|
print $4 ", " $0 r0mk 02.10.12 в 17:43 |
||
|
}' $* | r0mk 02.10.12 в 17:43 |
||
|
sort | r0mk 02.10.12 в 17:43 |
||
|
awk -F, ' r0mk 02.10.12 в 17:43 |
||
|
$1 == LastState { r0mk 02.10.12 в 17:43 |
||
|
print "\t" $2 r0mk 02.10.12 в 17:43 |
||
|
} r0mk 02.10.12 в 17:44 |
||
|
$1 != LastState { r0mk 02.10.12 в 17:44 |
||
|
LastState = $1 r0mk 02.10.12 в 17:44 |
||
|
print $1 r0mk 02.10.12 в 17:44 |
||
|
}' r0mk 02.10.12 в 17:44 |
||
|
Этот шелл скрипт содержит три части. Программа вызывает awk и придоставляет входные данные для программы sort, и затем вызывает awk снова для проверки отсортированных входных данных и разделения если имя штата является текущей записью так же как в прошлой записи. Давайте посмотрим скрипт в работе: r0mk 02.10.12 в 17:47 |
||
|
$ sed -f nameState list | byState r0mk 02.10.12 в 17:47 |
||
|
California r0mk 02.10.12 в 17:48 |
||
|
Amy Wilde r0mk 02.10.12 в 17:48 |
||
|
Massachusetts r0mk 02.10.12 в 17:48 |
||
|
Eric Adams r0mk 02.10.12 в 17:48 |
||
|
John Daggett r0mk 02.10.12 в 17:48 |
||
|
Sal Carpenter r0mk 02.10.12 в 17:48 |
||
|
Oklahoma r0mk 02.10.12 в 17:48 |
||
|
Orville Thomas r0mk 02.10.12 в 17:49 |
||
|
Pennsylvania r0mk 02.10.12 в 17:49 |
||
|
Terry Kalkas r0mk 02.10.12 в 17:49 |
||
|
Virginia r0mk 02.10.12 в 17:49 |
||
|
Alice Ford r0mk 02.10.12 в 17:49 |
||
|
Hubert Sims r0mk 02.10.12 в 17:49 |
