Литмир - Электронная Библиотека

Предположим, требуется быстро узнать, какой фильм пользуется наименьшим спросом в прокате. Для этого отсортируем файл по четвертому полю и направим результат команде 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. Найденная строка, из которой удаляется первое поле, присоединяется к исходной строке, и результат записывается в выходной поток.

40
{"b":"273485","o":1}