Потоковый редактор sed. С ним и без него

Недавно мне пришлось использовать еще одну команду sed для обработки полученных геофизических данных. Мне нужно было из большого текстового файла, содержащего тысячи строк, получить одну строку по ее номеру.

Ну, допустим, у нас есть текстовый файл из 1000 строк, а нам нужно достать из него только 123-ю строку. Как мы можем это сделать?

Классический вариант решения этой задачи состоит из тандема консольных команд head и tail. Первая выводит заданное количество строк от начала текста, вторая — заданное количество строк от конца текста.

Теперь, если мы команде head закажем вывести 123 строки от начала текста, а затем передадим полученный результат команде tail, которой укажем вывести только одну, последнюю строку, то мы достигнем нашей цели.

$ cat mytext.txt | head -123 | tail -1

Тот же результат может быть достигнут с помощью sed

$ cat mytext.txt | sed -n '123p'

Команда ‘123p’ говорит sed-у вывести 123 строку, а ключ -n — подавляет вывод. Странное поведение, да?

sed так устроен, что он выводит еще и текст, который он обрабатывает. В результате, если не указывать ключ -n, на выходе мы получим тот же самый текст, в котором 123-я строка будет продублирована. Понятно, что мы не этого хотим.

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

Если нужно вытащить из не одну, а фрагмент из нескольких строк, то sed-у  нужно указать начальную и конечную строку этого фрагмента.

Так, на пример, следующая команда вытащит из файла три строки — 123-ю, 124-ю и 125-ю:

$ cat mytext.txt | sed -n '123,125p'

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

По большому счету для получения результатов нужны две вещи — исходные данные и инструмент для их обработки. Данные находятся в текстовом файле, который элементарно можно смотреть и при необходимости править. Весь необходимый инструментарий для обработки уже имеется в утилитах Линукса. Остается только научиться  работать этими инструментами.

В качестве примера, как можно обрабатывать текстовые данные, не прибегая к языкам программирования, я хотел бы предложить задачу по транспонированию матрицы.

Допустим, у нас был такой файл matrix.txt:

1 2 3 4
5 6 7 8
9 10 11 12

И по каким-то причинам нам нужно строки сделать столбцами, а столбцы строками. Решать задачу в обычном текстовом редакторе — ну это себя не уважать! А представьте, что у вас табличка состоит не из простых одно-двухсимвольных чисел, а из более сложных слов или чисел. Нажимать Ctrl-C Ctrl-V — замаешься, и не на один раз ошибешься!

Я согласен, что эта пример сильно надуман. Но по жизни иногда всплывают подобные задачи для обработки информации. Ниже я привожу скрипт решения этой задачи. Привожу только для примера, что вообще можно творить с текстовой информацией. И это, к стати, не предел возможностй!

#! /bin/bash

# Построчно извлечем числа из исходного файла, превратим строки
# в столбцы, сохраним столбцы во временных файлах
cat $1 | sed -n '1p' | tr ' ' '\n' > $1.1
cat $1 | sed -n '2p' | tr ' ' '\n' > $1.2
cat $1 | sed -n '3p' | tr ' ' '\n' > $1.3

# Теперь "склеим" столбцы в единый файл
paste -d' ' $1.1 $1.2 > $1.a
paste -d' ' $1.a $1.3 > $1.t

# Почистим за собой
rm $1.[123a]

Только не забудьте сделать файл запускаемым (chmod +x transponir)

В результате команды

$ ./transponir matrix.txt

получим следующий файл matrix.txt.t:

1 5 9
2 6 10
3 7 11
4 8 12

Ну вот, собственно, не прибегая к языкам программирования я изменил представление информации. Это далеко не «глубина» Линукса. Это так, типа мелководье для мальков, типа меня. Возможности Линукса — безграничны. При этих словах у меня возникает какая-то странная ситуация с понятием «свобода» в контексте Виндовс и фрагментом из мультика:

— Каити, Каити! Нас и тут не плохо кормят…

Да. Пока человек сам не начнет творить своими руками мир, «втирать» ему про свободу, наверно, бесполезно.

Пример, с транспонирование матрицы, не очень удачный. Это не совсем тот тип задач, которые вообще решаются с помощью утилит операционной системы. Мне кажется эту задачу было бы правильнее решать в Python или какой-либо другом языке. Можно было и на Си написать прогу. Но на Си это заняло бы значительно больше времени. На Питоне, пожалуй, будет в самый раз. Но мне хотелось не красиво-решить-задачу, а показать мощь Линукса вообще, и в частности его ничем не ограниченные возможности.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s