В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13 |
Средства обработки структурированных данных
Приведем примеры использования служебной программы sort. Автор хранит данные о собственном кровяном давлении в виде файла pp.txt, содержащего пять столбцов: дата, время, верхнее давление, нижнее давление, пульс (см. листинг 6.8). Естественно, строки добавляются к файлу в хронологическом порядке. Чтобы упорядочить их по убыванию верхнего давления (третий столбец ), можно воспользоваться командой, показанной в листинге 6.9. Возможный результат приведен в листинге 6.10.
12.05.2000 17:30 200 125 120 15.05.2000 17:00 130 80 70 17.05.2000 10:30 150 90 70 17.05.2000 21:45 154 99 74 19.05.2000 10:05 158 83 89 21.05.2000 21:00 161 104 64 22.05.2000 21:00 147 104 69 . . .Листинг 6.8. Пример исходных данных для служебной программы sort.
sort -r -k 3,3 pp.txtЛистинг 6.9. Пример использования служебной программы sort.
12.05.2000 17:30 200 125 120 18.11.2000 19:30 172 107 68 04.07.2002 09:00 170 98 85 30.10.2001 13:00 168 94 88 27.12.2000 20:30 166 98 69 23.05.2002 10:00 166 104 56 22.05.2002 10:00 166 103 57 23.10.2001 11:00 165 88 88 . . .Листинг 6.10. Возможный результат работы служебной программы sort.
Если ключи сортировки равны, строки упорядочиваются с учетом всех байт. В рассматриваемом примере это не очень удобно, поскольку они начинаются с номера дня в месяце. Более естественно либо расширить ключ сортировки путем охвата полей нижнего давления и пульса, либо сделать эти поля дополнительными ключами. Оба варианта показаны в листинге 6.11, а результат сортировки - в листинге 6.12. Отметим, что второй вариант предпочтительнее, поскольку он устойчив к ошибкам выравнивания столбцов.
# Первый вариант - ключ сортировки покрывает # несколько полей sort -r -k 3,5 pp.txt # Второй вариант - используется несколько # ключей сортировки # sort -n -r -k 3,3 -k 4,4 -k 5,5 pp.txtЛистинг 6.11. Два варианта использования служебной программы sort.
12.05.2000 17:30 200 125 120 18.11.2000 19:30 172 107 68 04.07.2002 09:00 170 98 85 30.10.2001 13:00 168 94 88 23.05.2002 10:00 166 104 56 22.05.2002 10:00 166 103 57 27.12.2000 20:30 166 98 69 23.10.2001 11:00 165 88 88 . . .Листинг 6.12. Результат работы служебной программы sort с несколькими ключами сортировки.
Предположим теперь, что данные о давлении и пульсе разбиты по годам и в уже отсортированном виде хранятся в файлах pp2000.sorted, pp2001.sorted и т.д. Для их слияния можно воспользоваться командной строкой или циклом из листинга 6.13. Опять-таки второй вариант предпочтительнее по причине его устойчивости к количеству исходных файлов.
# Первый вариант слияния файлов # sort -m -o pp.sorted -n -r -k 3,3 -k 4,4 # -k 5,5 pp2*.sorted # Второй вариант слияния файлов > pp.sorted for f in pp2*.sorted do sort -m -o pp.sorted -n -r -k 3,3\ -k 4,4 -k 5,5 $f pp.sorted doneЛистинг 6.13. Два варианта слияния файлов с помощью служебной программы sort.
Проверить правильность слияния можно с помощью команд, показанных в листинге 6.14.
name=pp.sorted if sort -c -r -n -k 3,3 -k 4,4 -k 5,5 $name then echo Данные в файле $name отсортированы\ верно elif echo Данные в файле $name отсортированы\ неверно fiЛистинг 6.14. Проверка правильности упорядоченности строк в файле с помощью служебной программы sort.
Содержимое файлов f1 и f2 сортирует команда (см. листинг 6.15) , применяющая в качестве ключа второй непробельный символ второго поля.
sort -k 2.2b,2.2b f1 f2Листинг 6.15. Пример использования служебной программы sort с модификаторами в определении ключей.
Отсортировать базу данных пользователей по числовым значениям идентификаторов пользователей (третье поле, поля разделяются символом :) можно посредством команды, показанной в листинге 6.16.
sort -t ':' -k 3,3n /etc/passwdЛистинг 6.16. Пример использования служебной программы sort с опцией -t.
Выдать содержимое уже отсортированного файла f.sorted, выводя лишь первую из строк с одинаковыми третьими полями, поможет комбинация опций -m и -u (см. листинг 6.17).
sort -um -k 3.1,3 f.sortedЛистинг 6.17. Пример использования служебной программы sort с опциями -m и -u.