Извлечение и сортировка текста в Unix

Команда cat и прочие утилиты, которые я описывал ранее в статье “Обзор основных команд UNIX”, выводят на экран все содержимое текстового файла. Когда необходимо просматривать только определенные части файла, можно применять утилиты,предназначенные специально для извлечения текста. В следующих подразделах рассказывается о том, как использовать некоторые из таких важных утилит.

Применение grep для выполнения сопоставления по шаблону Команда grep уже вкратце описывалась ранее в моем блоге — она позволяет выполнять в файле поиск совпадений с определенным шаблоном с использованием регулярных выражений. (Хорошее учебное пособие по регулярным выражениям доступно по адресу http://www.regular-expressions.info/tutorial.html.) Слово “grep” является сокращением от “global regular expression print” (“глобальная печать с помощью регулярных выражений”) и происходит от следующей команды vi, которая распечатывает все строки, совпадающие с регулярным выражением re:

g/re/p 

К регулярным выражениям можно относиться как к критериям поиска, применяемым для обнаружения текста в файле, и тогда команду grep можно считать похожей на применяемую в других операционных системах команду find. В частности, команда grep выполняет в каждой строке файла (или файлов) поиск первого вхождения заданной строки и если ей удается обнаружить такую строку, выводит ее на экран. Например,чтобы отобразить на экране только строки из файла test.txt, которые содержат словосочетание “oracle database”, можно использовать такую команду grep:

$ grep 'oracle database' test.txt

Чтобы отобразить на экране только строки из файла test.txt, которые не содержат словосочетания “oracle database”, нужно применить команду grep с параметром -v, как показано ниже:

$ grep -v 'oracle database' test.txt

Помимо параметра -v, с командой grep можно также использовать еще несколько других параметров:

  • -c — для отображения количества обнаруженных совпадений в каждом входном файле;
  • -l — для отображения имени каждого входного файла;
  • -n — для отображения номера каждой выводимой строки.
  • -i — для игнорирования регистра букв в выражении.

Помимо команды grep для выполнения поиска в файлах можно применять команду fgrep (fixed grep). Эта команда не подразумевает использования регулярных выражений. Она сравнивает строки напрямую, отыскивая совпадения с фиксированной строкой, а не с регулярным выражением.

Команда egrep, представляющая собой еще одну разновидность команды grep, имеет дело со сложными регулярным выражениями и работает быстрее обычной команды grep.

Вырезание, вставка и объединение текста

Часто бывает необходимо вырезать часть текста из файла или объединить вместе текст из нескольких файлов. В UNIX для решения этих задач предусмотрены замечательные команды, которые более подробно рассматриваются в следующих подразделах.

Вывод столбцов с помощью команды cut

Команда cut позволяет выводить на экран только определенные столбцы из текстового файла. Для примера создадим файл по имени example.txt, содержащий такой текст:

 
one two three
four five six
seven eight nine
ten eleven twelve

Указывать поля, которые требуется извлечь, можно с помощью параметра -f. То есть извлечь из файла example.txt только второй столбец можно так:

 
$ cut -f2 example.txt
two
five
eight
eleven

Параметр -c позволяет указывать, какие конкретно символы требуется извлечь из файла. Например, первая из приведенных ниже команд показывает, как извлечь из файла password.txt только десятый символ, а вторая — как извлечь из него символы в диапазоне с 10 по 12:

$ password.txt | cut -c10
$ password.txt | cut -c10-12 

Совместное использование параметров –d и –f позволяет извлечь символы вплоть до указанного разделителя. Например, в приведенной ниже команде cut параметр-f1 указывает, что из файла passwd требуется извлечь только первое поле, а параметр –d":" — что разделителем этого поля является символ двоеточия. (Файл passwd, находящийся в каталоге /etc, представляет собой место, в котором в системах UNIX и Linux хранится информация об учетных записях пользователей.)

$ cut -d":" -f1 /etc/passwd
root
daemon
bin
sys
adm
uucp
mail

Объединение файлов с помощью команды paste

Команда paste берет одну строку из одного источника и объединяет ее с другой строкой из другого источника. Предположим, что имеется два файла: test1.txt, в котором содержится строка one two three, и test2.txt, в котором есть строка one four five six. Тогда для их объединения вместе можно применить такую команду paste:

$ paste test1.txt test2.txt
one two three one four five six 

Объединение файлов с помощью команды join

Команда join тоже позволяет объединять содержимое двух файлов, но работает только при наличии у объединяемых файлов общего поля. У файлов test1.txt и test2.txt из предыдущего раздела общего поля нет, поэтому выполнение команды join для них не приведет к получению каких-либо результатов. Однако предположим,что есть два других файла — test.one и test.two, содержимое которых выглядит следующим образом:

 
test.one test.two
11111 Dallas 11111 High Tech
22222 Houston 22222 Oil and Energy

По умолчанию команда join просматривает на предмет совпадения только первые поля, поэтому в случае ее применения для файлов test.one и test.two результат на основании их общего (первого) столбца будет выглядеть так: 

$ join test.one test.two
11111 Dallas High Tech
22222 Houston Oil and Energy

С помощью параметра -1 можно указывать команде join, какое поле должно использоваться для сопоставления в первом файле, а с помощью параметра -2 — то же для второго файла. Например, если второе поле в первом файле сопоставляется с третьим полем во втором файле, команда join может выглядеть следующим образом: 

$ join -1 2 -2 3 test.one test.two

Параметр –o позволяет указывать подлежащие выводу поля в формате файл.поле.То есть, чтобы распечатать второе поле первого файла и третье поле второго файла в совпадающих строках, можно применить команду join со следующими параметрами: 

$ join -o 1.2 2.3 test.one test.two

Сортировка текста с помощью команды sort

Команда sort осуществляет сортировку строк текстовых файлов, передаваемых ей как из конвейера, так и из файла. В случае применения вместе с ней параметра –m она просто объединяет файлы, не сортируя их. Предположим, что имеется файл по имени test.txt, в котором содержатся следующие строки: 

$ cat test.txt
yyyy
bbbb
aaaa
nnnn

Тогда с помощью команды sort можно отобразить содержимое этого файла в алфавитном порядке:

$ sort test.txt
aaaa
bbbb
nnnn
yyyy 

По умолчанию команда sort выполняет сортировку по первому столбцу текста.

Удаление дублированных строк с помощью команды uniq

Команда uniq позволяет удалять дублированные строки из отсортированного файла. Она часто выполняется в конвейере следом за командой sort. В случае применения с ней параметра –c она может подсчитывать количество обнаруживаемых вхождений каждой строки, а в случае применения параметра –d — только сообщать о дублированных строках. 

$ sort -m test.one test.two | uniq -c
1 New test.
2 Now testing
1 Only a test.

В приведенном выше примере команда sort объединяет два файла — test.one и test.two — из-за наличия параметра –m, после чего ее вывод по конвейеру передается команде uniq с параметром –c. В результате на экране отображается отсортированный в алфавитном порядке список без дублированных строк вместе с количеством вхождений для каждой строки.

Вас заинтересует / Intresting for you:

Нормализация информации  в баз...
Нормализация информации в баз... 1816 просмотров Ирина Светлова Tue, 21 Nov 2017, 13:28:01
Хранимые процедуры Oracle
Хранимые процедуры Oracle 5213 просмотров Надин Tue, 21 Nov 2017, 13:32:12
Oracle 9i Enterprise Edition
Oracle 9i Enterprise Edition 5722 просмотров Antoniy Tue, 21 Nov 2017, 13:32:12
Словарь данных Oracle и динами...
Словарь данных Oracle и динами... 7411 просмотров Игорь Воронов Tue, 21 Nov 2017, 13:18:46
Войдите чтобы комментировать