Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 6:

Средства обработки структурированных данных

Приведем примеры использования служебной программы 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.
Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?