Готовый перевод sed & awk / sed & awk: 2.5 Совместное использование sed и awk
В UNIX пайп может быть использован для пропуска вывода из одной программы в следующую программу. Давайте посмотрим несколько примеров, которые объединяют sed и awk для вывода отчета. Sed скрипт заменит почтовую аббревиатуру штата на полное имя штата, скрипт nameState является достаточно полным и будет использован повторно:
$ cat nameState
s/ CA/, California/
s/ MA/, Massachusetts/
s/ OK/, Oklahoma/
s/ PA/, Pennsylvania/
s/ VA/, Virginia/
Конечно Вы хотите обрабатывать все штаты, а не тоглько 5, и если Вы запустите его на документе, который отличается от списка рассылки, Вам следует убедиться, что он не делает ненужных замен.
Вывод этой программы использует на входе список, так, как мы уже рассматривали раньше. В следующем примере вывод обрабатывается скриптом nameState и черзе пайп передается программе awk, которая извлекает имя штата из каждой записи.
$ sed -f nameState list | awk -F, '{ print $4 }'
Massachusetts
Virginia
Oklahoma
Pennsylvania
Massachusetts
Virginia
California
Massachusetts
Программа awk обрабатывает вывод, предоставленный sed скриптом. Запомните, что sed скрипт заменяет аббревиатуру с запятой и полное имя штата. Фактически, он разделяет третье поле, содержащее город и штат на два поля. $4 указывает на четвертое поле.
Все что бы делаем, можно полность реализовать в sed, но возможно с большими трудностями и менее основательно. Так же, поскольку awk позволяет Вам строку на шаблон, Вы можете достичь этого результата полностью на awk скрипте.
Пока результат этой програмы не очень применим, его стоит пропустить через sort | uniq -c, которые отсортируют штаты в алфавитном порядке с нумерацией на каждой строке.
Сейчас мы сделаем кое что более интерестное. Мы хотим предоставить отчет, отсортированный по имени штата и список имен людей проживающих в штате. Следующий пример показывает программу byState.
#! /bin/sh
awk -F, '{
print $4 ", " $0
}' $* |
sort |
awk -F, '
$1 == LastState {
print "\t" $2
}
$1 != LastState {
LastState = $1
print $1
}'
Этот шелл скрипт содержит три части. Программа вызывает awk и придоставляет входные данные для программы sort, и затем вызывает awk снова для проверки отсортированных входных данных и разделения если имя штата является текущей записью так же как в прошлой записи. Давайте посмотрим скрипт в работе:
$ sed -f nameState list | byState
California
Amy Wilde
Massachusetts
Eric Adams
John Daggett
Sal Carpenter
Oklahoma
Orville Thomas
Pennsylvania
Terry Kalkas
Virginia
Alice Ford
Hubert Sims
Имена отсортированы по штату. Это обычный пример использования awk для создания отчета структурированных данных.
Для объяснения как программа byState работает, давайте взгянем на каждую часть отдельно. Она предназначена для чтения входных данных из программы nameState и ожидает, что "$4" будет именем штата. Посмотрим вывод предоставленный первой строкой программы:
$ sed -f nameState list | awk -F, '{ print $4 ", " $0 }'
Massachusetts, John Daggett, 341 King Road, Plymouth, Massachusetts
Virginia, Alice Ford, 22 East Broadway, Richmond, Virginia
Oklahoma, Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma
Pennsylvania, Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
Massachusetts, Eric Adams, 20 Post Road, Sudbury, Massachusetts
Virginia, Hubert Sims, 328A Brook Road, Roanoke, Virginia
California, Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
Massachusetts, Sal Carpenter, 73 6th Street, Boston, Massachusetts
Программы sort, по-умолчанию, сортирует строки в алфавитном порядке, смотря на символы слева направо. В отчете на сортировку записей по штату, а не имени, мы вставляем штат как ключ для сортировки в начало записи. Теперь программа sort может сделать для нас эту работу.(Запомните, что использование утилиты sort спасло нас от написания сортировочных правил внутри awk.)
На втором этапе мы вызваем awk для выполниня задач программирования. Скрипт смотрит на первое поле каждой записи (штат) для определения является ли оно таким же как и предыдущаее. Если оно не такое же, то имя штата печатается, а затем имя человек, если оно такое же, тогда печается только имя человека.
$1 == LastState {
print "\t" $2
}
$1 != LastState {
LastState = $1
print $1
print "\t" $2
}'
Здесь есть несколько вожных вещей, включая присвоение переменной, проверки первного поля каждой входной строки, содержит ли оно переменную строку, и печать табуляции для отделения выходных данных. Запомните, мы не назначаем переменную до ее использования( потому, что переменные awk инициализируются как пустая строка). Это небольшой скрипт, но Вы можете увидеть сколько шаблонов использовано для создания заголовков в более большой программе индексирования в Главе 12, Полнофункциональное приложение. Однако, сейчас не стоит переживать над пониманием того, что каждый оператор делает. Наша цель здесь, дать Вам представление о том, что sed и awk могут делать.
В этой главе мы обсудили основные операторации sed и awk. Мы посмотрели на важдые опции командной строки и разссмотрели написание скриптов. В следующей главе мы взглянем на регулярные выражения, как обе программы используют совпадение по шаблону во входных данных.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется
Переведено на Нотабеноиде
http://notabenoid.org/book/32181/114523
Переводчики: r0mk
Настройки
Готово:
