Вперед Назад Содержание

7. Обработка и сортировка файов

Эти утилиты производят и обрабатывают сортированные файлы.

7.1 `sort': сортировка текстовых файлов

Утилита `sort' сортирует, объединяет и сравнивает все строки файла, указанного в качестве аргумента FILE. Если имя файла не указано, или в качестве одного из аргументов задан минус '-', то, по умолчанию `sort' считывает данные из стандартного ввода.

Общая запись:

sort [OPTION]... [FILE]...
Утилита `sort' имеет три операционных режима: сортировка (по умолчанию), слияние, и проверка или сравнение. Следующие опции изменяют операционный режим:
`-c'

Проверяет отсортированны ли указанные файлы и, если они не отсортированны, выводит сообщение об ошибке и завершает работу со статусом 1.

`-m'

Сливает указанные файлы сортируя их, как единый блок. Каждый входной файл должен быть уже отсортирован. По умолчанию, 'sort' сортирует все указанные файлы.

Пара строк сравнивается следующим образом: если задана какая-нибудь из опций сортировки полей, `sort' сравнивает каждую пару полей, в порядке определенном в командной строке, согласно указанным опциям, пока не будет найдено различие или не кончатся поля. (Полями называются последовательности символов, не содержащие табуляции и пробелов, которые отделяются друг от друга пробелами или табуляциями.)

Если даны какие-нибудь глобальные опции `Mbdfinr', но не заданны опции сортировки полей, `sort' сравнивает целые строки согласно глобальным опциям.

И наконец, как последнее средство, если сравнение согласно опциям ни к чему не приводит (или опции не заданны), `sort' сравнивает строки байт за байтом в "машинной" последовательности. Опция `-s' аннулирует наше последнее средство, т.ч. строки с равными полями не меняют положение относительно друг друга. Если опции не заданы вообще, то `-s' теряет силу.

GNU утилита `sort' (как и все GNU утилиты) не имеет ограничений на длину входной строки. К тому же, если последний символ файла не символ перевода стрки, то `sort' просто приписывает его (символ перевода стрки) к файлу.

Если переменная оболочки `TMPDIR' установленна, то `sort' использует ее, как каталог для временных файлов, вместо `/tmp'. Опция `-T TEMPDIR', в свою очередь, изменяет эту переменную оболочки.

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

`-b'

Игнорирует отступ слева при сортировке строк.

`-d'

При сортировке игнорируются все символы кроме букв, цифр и пробелов.

`-f'

При сортировке не различает символы верхнего и нижнего регистров, например, `b' и `B' не различаются.

`-i'

Обрабатывает только графические символы ASCII (восьмеричный код 040-0176).

`-M'

Строки, состоящие из нескольких начальных пробелов и трехбуквенной аббревиатуры названия месяца сортируются в порядке: `JAN' < `FEB' < ... < `DEC' (символы каждой аббревиатуры заменяются на соответствующие символы верхнего регистра). Неправильные названия (если они есть) сортируются после правильных.

`-n'

Числовая сортировка, т.е. сортировка по числу в каждой строке. Oно может включать в себя несколько предстоящих пробелов, знак `-', несколько цифр и еще нсколько цифр, следующих за десятичной точкой.

`-r'

Меняет порядок на обратный.

Другие опции:
`-o OUTPUT-FILE'

Выводит данные в файл OUTPUT-FILE вместо стандартного вывода. Если OUTPUT-FILE является одним из входных файлов, `sort' перед сортировкой копирует его во временный файл, и выводит данные в OUTPUT-FILE.

`-t SEPARATOR'

Использует символ SEPARATOR как разделитель полей. По умолчанию, поля разделяются несколькими пробелами. Т.е. если дана входная строка ` foo bar', `sort' разобьет ее на поля ` foo' и ` bar'. Но разделитель полей не является частью ни предыдущего, ни следующего поля.

`-u'

В обычном режиме или в режиме `-m', выводит только первую из нескольких равных строк. А в режиме `-c' проверяет чтобы не было последовательных равных строк.

`-k POS1[,POS2]'

Опция, рекомендованная POSIX, для определения полей. Поле состоит из символов строки от POS1-го до POS2-го, включительно (или до конца строки, если POS2 опущено). Позиции символов и полей нумеруются начиная с единицы. См. ниже.

`+POS1[-POS2]'

Традиционная опция определения полей. Поле состоит из символов строки от POS1-го до, но не включая, POS2-го (или до конца строки, если POS2 опущено). Позиции символов и полей нумеруются начиная с 0. См. ниже.

GNU утилита `sort' воспринимает еще две опции: `--help' и `--version' (см. главу 2 'Общие Опции').

Старые (BSD и System V) реализации утилиты `sort' отличаются реализацией некоторых опций, особенно `-b', `-f', и `-n'. GNU утилита 'sort' ориентируется на стандарт POSIX, который, в свою очередь, cхож (но не полностью!) со стандартом System V. Согласно POSIX, опция `-n' теперь не подразумевает автоматического включеня опции `-b'. Для согласованности, опция `-M' была изменена. В некоторых случаях это может изменить смысл позиции символа в задании поля. Единственный способ решить эту проблему указать опцию `-b'.

Позиции в полях сортировки задаваемые опцией `-k' или `+' имеют вид `F.C', где F - это номер используемого поля, а C - номер символа считая с начала этого поля или с конца предыдущего поля. Если `.C' опущено, то рассматривается первый символ (не пробел) поля. Если задана опция `-b', отсчет `.C' начинается с первого непустого символа поля (для `+POS') или с первого непустого символа следующего за предыдущим полем (для `-POS').

К опциям сортировки полей могут быть приписаны символы глобальных опций `Mbdfinr', в этом случае данные символы используются в качестве модификаторов (для указания типа сортировки конкретных полей строки). Опцию `-b' можно независимо приписать к одной или обоим `+POS' и `-POS' частям определения поля, а как глобальная опция она действует сразу на обе. Действие опций сортировки может распространяться на конкретные поля строки. См. ниже.

Далее представлены несколько иллюстраций различных комбинаций опций. POSIX опция `-k' используется вместо устаревший записи `+POS1-POS2'. Обратная числовая сортировка:

sort -nr
Сортировка по алфавиту, не учитывая первое и второе поле. Для этого используется опция сортировки, показывающая, что сравниваемая часть начинается с начального символа третьего поля и продолжается до конца строки:
sort -k3
Числовая сортировка по второму полю и дополнительная алфавитная сортировка по третьему и четвертому символам пятого поля. Символ `:' исполльзуется для разделения полей:
sort -t : -k 2,2n -k 5.3,5.4
Отметьте, что если Вы напишете `-k 2' вместо `-k 2,2', `sort' будет использовать для числовой сортировки все символы с начала второго поля и до конца строки. Так же отметьте, что модификатор `n' приписан к индикатору конечного поля. Все модификаторы воспринимаются независимо от того приписан ли символ модификатора к индикатору начального поля и/или к индикатору конечного поля. Т.е. наша запись элвивалентна `-k 2n,2' и `-k 2n,2n'.

Сортировка файла паролей по пятому полю игнорируя любые предстоящие пробелы. Строки с равными пятыми полями сортируются по номерам пользовательских ID в третьем поле: Альтернативно можно использовать глобальную опцию `-n':

sort -t : -n -k 5b,5 -k 3,3 /etc/passwd
Если приписать `b' еще и к индикатору конечного поля, то будут игнорироваться и завершающие пробелы:
sort -t : -n -k 5b,5b -k 3,3 /etc/passwd
Для этого можно использовать и глобальную опцию `-b' вместо `-n' указав модификатор `n' во второй опции сортировки полей:
sort -t : -b -k 5,5 -k 3,3n /etc/passwd

7.2 `uniq': унификация файлов

Утилита `uniq' выводит "уникальные" строки взятые из входа INPUT (или стандартного входа, если INPUT опущен или заменен на `-').

Общая запись:

uniq [OPTION]... [INPUT [OUTPUT]]
По умолчанию, `uniq' выводит "уникальные" строки в сортированный файл, т.е., из последовательных тождественных строк выводит только одну. Но, если нужно, она может наоборот отбрасывать строки представленные в единственном числе или выводть строки имеющиеся только в единственном экземпляре.

Входные данные должны быть уже отсортированны. Если данные не отсортированны, то Вам необходимо использовать `sort -u'.

Если файл OUTPUT не определен, то `uniq' выводит данные в стандартный вывод.

Утилита воспринимает следующие опции (см. так же главу 2 'Общие Опции'):

`-N' или `-f N' или `--skip-fields=N'

Пропускает N полей в строке перед сравнением. Полями называются последовательности символов, не содержащие табуляции и пробелов, которые отделяются друг от друга пробелами или табуляциями.

`+N' или `-s N' или `--skip-chars=N'

Пропускает N символов в строке перед сравнением. Если Вы используете еще и предыдущую опцию, то поля будут пропускаться кроме первого.

`-c' или `--count'

Выводит число повторений строки в файле.

`-d' или `--repeated'

Вывод только повторяющиехся строк.

`-u' или `--unique'

Вывод только неповторяющихся строк.

`-w N' или `--check-chars=N'

Сравнивает первые N символов каждой строки (после пропуска заданного количества символов и/или полей).

7.3 `comm': построчное сравнивание двух файлов

Утилита `comm' выводит строки, которые являются общими для двух входных файлов и неповторяющиеся строки, представленные только в одном файле. Если имеется имя файла `-', то подразумевается стандартный вывод.

Общая запись:

comm [OPTION]... FILE1 FILE2
Входные файлы должны быть отсортированны перед использованием `comm'.

Если опции не заданны, `comm' производит вывод в три колонки. Первая колонка содержит неповторяющиеся строки, представленные только в файле FILE1, вторая - неповторяющиеся строки, представленные только в файле FILE2, а третья - общие строки этих файлов.

Опции `-1', `-2', и `-3' подавляют вывод соответствующих колонок (см. так же главу 2 'Общие Опции').


Вперед Назад Содержание