$ 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. Найденная строка, из которой удаляется первое поле, присоединяется к исходной строке, и результат записывается в выходной поток.
5. Пункты 3 и 4 повторяются до тех пор, пока во втором файле есть строки с совпадающим первым полем.