Предположим, требуется быстро узнать, какой фильм пользуется наименьшим спросом в прокате. Для этого отсортируем файл по четвертому полю и направим результат команде head, задав в ней отображение одной строки:
$ sort -t: — k4 video.txt | head -1
Alien:HK:119:1982
Аналогичным образом можно выяснить, какой фильм чаще всего заказывали в этом году. Формат команды sort останется таким же, но результат будет передан команде tail:
$ sort -t: — k4 video.txt | tail -1
A few Good Men:KL:445:5851
11.1.15. Передача результатов сортировки утилите awk
Может возникнуть необходимость по результатам сортировки отобразить небольшое итоговое сообщение. Сделать это легко, если воспользоваться возможностями утилиты awk. В следующем примере сведения о фильме с наименьшим объемом проката за год посредством канала направляются утилите awk, которая дополняет их поясняющим текстом. В качестве разделителя полей в обеих утилитах применяется двоеточие.
$ sort -t: — k4 video.txt | head -1 | \
awk -F: '{print "Worst rental", $1, "has been rented", $3, "times"}'
Worst rental Alien has been rented 119 times
11.1.16. Объединение двух отсортированных файлов
Прежде чем объединять два файла, их необходимо отсортировать, иначе результат будет неотсортированным. Предположим, нам прислали файл video2.txt, содержащий дополнения к уже имеющемуся перечню фильмов, причем этот файл отсортирован:
$ cat video2.txt
Crimson Tide:134:2031 Die Hard:152:2981
Необходимо объединить его с файлом video.txt. Для этого нужно предварительно создать отсортированную версию файла video.txt, которую назовем video.sort, а затем применить команду sort с опцией -m:
$ sort -t: — m -k1 video2.txt video.sort
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Crimson Tide:134:2031
Die Hard:152:2981
Star Wars:HK:301:4102
The Hill:KL:63:2972
Toy Story:HK:239:3972
11.1.17. Дополнительные примеры команды sort
Команда sort может применяться для сортировки имен пользователей в файле /etc/passwd. Достаточно выполнить сортировку содержимого этого файла по первому полю, которое включает регистрационные имена, а затем по каналу передать полученный результат утилите awk. Последняя отобразит содержимое только первого поля данного файла:
$ cat /etc/pasawd | sort -t: — k1 | awk -F: '{print $1}'
adm bin daemon
Команда sort может работать совместно с командой df, выводя на экран информацию об имеющихся файловых системах в порядке убывания процента используемого ими дискового пространства. Ниже приводится образец работы команды df:
$ df
Filesystem Ik‑blocks Used Available Use% Mounted on
/dev/hda5 495714 291027 179086 62% /
/dev/hda1 614672 558896 55776 91% /dos
Выполним сортировку по полю 5, содержащему процент дискового пространства, занимаемого файловой системой, только предварительно с помощью редактора sed удалим первую строку. В процессе сортировки также воспользуемся опцией -b, которая позволяет игнорировать любое количество начальных пробелов.
$ df | sed '1d' | sort -b -r -k5
/dev/hda1 614672 558896 55776 91% /dos
/dev/hda5 495714 291027 179086 62% /
11.2. Удаление повторяющихся строк с помощью команды uniq
Команда uniq применяется для удаления идущих подряд повторяющихся строк из текстового файла. Для правильного применения команды uniq важно, чтобы рассматриваемый файл был отсортирован. Однако это требование не является обязательным. Можно обращаться к произвольному неупорядоченному тексту и даже сравнивать отдельные фрагменты строк.
Эту команду можно рассматривать как вариант опции — и команды sort. Следует, однако, учитывать весьма важное отличие. Опция -u позволяет избавиться от всех одинаковых строк в файле, тогда как команда uniq обнаруживает повторяющиеся строки только в том случае, когда они следуют одна за другой. Если же на вход команды uniq подать отсортированный файл, то действие команд sort -u и uniq будет одинаковым.
Рассмотрим пример. Имеется следующий файл:
$ cat myfile.txt
May Day
May Day
May Day
Going Down
May Day
В данном случае команда uniq будет рассматривать первые три строки как повторяющиеся. Пятая строка таковой не считается, потому что не совпадает с четвертой строкой.
11.2.1. Синтаксис
Общий формат команды uniq таков:
uniq опции входной_файл выходной_файл
Ниже перечислены некоторые из ее опций:
-u Отображение только не повторяющихся строк
-d Отображение одной копии каждой повторяющейся строки
-c Удаление повторяющихся строк с выводом перед каждой из оставшихся строк
числа повторений -f n Игнорирование первых п полей; полем считается последовательность непробельных символов, завершающаяся пробелом или табуляцией
В некоторых системах опция -f не распознается, в этом случае вместо нее следует использовать опцию -n, где п — номер поля.
Давайте применим команду uniq к показанному выше файлу myfile.txt.
$ uniq myfile.txt
May Day
Going Down'
May Day
Как уже говорилось, последняя строка не считается повторяющейся. Если же выполнить над файлом команду sort -u, будут получены только две строки:
$ sort -u myfile.txt
Going Down
May Day
11.2.2. Определение количества повторений
Указав в команде uniq опцию -c, можно не только отбросить повторяющиеся строки, но и узнать, сколько раз повторяется каждая строка. В следующем примере команда uniq сообщает о том, что первая строка "May Day" встречается три раза подряд:
$ uniq -с myfile.txt
3 May Day
1 Going Down
1 May Day
11.2.3. Отображение только повторяющихся строк
Опция -d позволяет отобразить только те строки, которые встречаются несколько раз подряд:
$ uniq -d myfile.txt
Mау Day
11.2.4. Проверка уникальности отдельных полей
Команда uniq позволяет разбивать файл на поля, разделенные пробелами, с тем чтобы можно было исключать требуемые поля из процедуры проверки. Ниже показан небольшой файл, содержащий две колонки текста, причем содержимое второго поля в каждой строке одинаковое:
$ cat parts.txt
AK123 OP
OК122 OP
OК999 OP
Если к этому файлу применить команду uniq, будут отображены все строки, поскольку все они разные.
$ uniq parts.txt
AК123 OP
OK122 OP
OK999 OP
Если же выполнить проверку только по второму полю, получим иной результат. Команда uniq сравнит повторяющиеся поля "ОР" и отобразит только одну строку:
$ uniq -f1 parts.txt
OK123 OP
11.3. Объединение файлов с помощью команды join
Команда join выполняет соединение строк из двух текстовых файлов на основании совпадения указанных полей. Ее действие напоминает операцию join языка SQL. Механизм работы команды таков:
1. Каждый из двух входных файлов разбивается на поля (по умолчанию разделителем полей является пробел).
2. Из первого файла извлекается первая строка, а из нее — первое поле (можно указать другое поле).
3. Во втором файле ищется строка, имеющая такое же первое поле.
4. Найденная строка, из которой удаляется первое поле, присоединяется к исходной строке, и результат записывается в выходной поток.