Эту команду можно рассматривать как вариант опции — и команды sort. Следует, однако, учитывать весьма важное отличие. Опция -u позволяет избавиться от всех одинаковых строк в файле, тогда как команда uniq обнаруживает повторяющиеся строки только в том случае, когда они следуют одна за другой. Если же на вход команды uniq подать отсортированный файл, то действие команд sort -u и uniq будет одинаковым.
Рассмотрим пример. Имеется следующий файл:
$ cat myfile.txt
May Day
May Day
May Day
Going Down
May Day
В данном случае команда uniq будет рассматривать первые три строки как повторяющиеся. Пятая строка таковой не считается, потому что не совпадает с четвертой строкой.
Общий формат команды 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
Указав в команде uniq опцию -c, можно не только отбросить повторяющиеся строки, но и узнать, сколько раз повторяется каждая строка. В следующем примере команда uniq сообщает о том, что первая строка "May Day" встречается три раза подряд:
$ uniq -с myfile.txt
3 May Day
1 Going Down
1 May Day
Опция -d позволяет отобразить только те строки, которые встречаются несколько раз подряд:
$ uniq -d myfile.txt
Mау Day
Команда 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 повторяются до тех пор, пока во втором файле есть строки с совпадающим первым полем.
6. Пункты 2—6 повторяются для каждой строки первого файла.
Таким образом, в выходной поток попадают только строки, имеющие общие компоненты.
Общий формат команды join таков:
join [опции] входной_файл1 входной_файл2
Рассмотрим некоторые наиболее важные опции этой команды: