Шрифт:
$ 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
Рассмотрим некоторые наиболее важные опции этой команды:
– a
n
Задает включение в выходной поток строк из файла n (n -l или 2), для которых не было найдено ни одного совпадения по указанному полю.
– o
формат
Задает формат выводимой строки. Параметр формат представляет собой разделенный запятыми или пробелами список спецификаций, каждая из которых, в свою очередь, имеет формат номер_файла. поле. По умолчанию формат выводимой строки таков:
1 — поле, по которому производится объединение;
2 -oставшаяся часть первой строки;
3 -oставшаяся часть второй строки.
– 1
поле
Объединять строки по указанному полю первого файла (по умолчанию таковым является первое поле)
– 2
поле
Объединять строки по указанному полю второго файла (по умолчанию таковым является первое поле)
– t
символ
Задает разделитель полей во входном и выходном потоках
11.3.1. Объединение двух файлов
Предположим, имеется два текстовых файла: один называется names.txt и содержит имена пользователей с указанием улиц, на которых они проживают, а другой называется town.txt и содержит имена пользователей с указанием городов, в которых они живут.
$ cat names.txt
M. Golls 12 Hidd Rd
P. Heller The Acre
P. Willey 132 The Grove
T. Norms 84 Connaught Rd
K. Fletch 12 Woodlea
$ cat town.txt
M. Golls Norwich NRD
P. Willey Galashiels GDD
T. Norms Brandon BSL
K. Fletch Mildenhall MAF
Задача состоит в таком соединении двух файлов, чтобы итоговый файл содержал имена пользователей и их полные адреса. Очевидно, что общим полем является первое. Команда join по умолчанию выполняет объединение файлов именно по первому полю.
$ join names.txt town.txt
M. Golls 12 Hidd Rd Norwich NRD
P. Willey 132 The Grove Galashiels GDD
T. Norms 6-3 Connaught Rd Brandon BSL
K. Fletch 12 Woodlea Mildenhall MAF
Как видите, пользователь P. Heller, для которого нет строки во втором файле, в результаты работы команды join не попал.
11.3.2. Включение несовпадающих строк
Если требуется все-таки включить информацию о пользователе P. Heller в выходные данные, воспользуйтесь опцией -a. Поскольку исходная строка находится в первом файле, параметром данной опции будет цифра 1: