Как извлечь заранее заданный диапазон строк из текстового файла в Unix?
У меня есть дамп SQL длиной около 23000
строк, содержащий данные нескольких баз данных. Мне нужно извлечь определённый раздел этого файла (т.е. данные для одной базы данных) и поместить его в новый файл. Я знаю как номер строки начала, так и номер строки конца данных, которые мне нужны.
Кто-нибудь знает команду Unix (или серию команд), которая позволит извлечь все строки из файла между, скажем, строками 16224
и 16482
, а затем перенаправить их в новый файл?
5 ответ(ов)
Команда sed -n '16224,16482 p' orig-data-file > new-file
используется для извлечения определенного диапазона строк из файла. В данном случае числа 16224
и 16482
указывают на начальный и конечный номера строки, которые нужно извлечь (включительно). Обратите внимание, что нумерация строк здесь начинается с единицы.
Опция -n
подавляет вывод всех строк, что позволяет вам избежать вывода ненужной информации. Команда p
в данном случае указывает sed
напечатать только те строки, которые попадают в указанный диапазон.
Таким образом, после выполнения этой команды строки с номерами от 16224 до 16482 из файла orig-data-file
будут записаны в файл new-file
.
Для извлечения определенного диапазона строк из файла in.sql
и записи их в out.sql
можно использовать несколько команд.
- С помощью
head
иtail
:
head -16482 in.sql | tail -258 > out.sql
Эта команда сначала выводит первые 16482 строки из файла, а затем передает вывод в tail
, который выбирает последние 258 строк из этого результата и записывает их в out.sql
.
- С помощью
sed
:
sed -n '16224,16482p' in.sql > out.sql
Здесь sed
используется с параметром -n
, который подавляет вывод, и командой p
, которая печатает только строки с 16224 по 16482.
- С помощью
awk
:
awk 'NR>=16224&&NR<=16482' in.sql > out.sql
В этом примере awk
проверяет номер текущей строки (NR
) и выводит только те строки, которые находятся в диапазоне от 16224 до 16482, записывая их в out.sql
.
Выберите любой из этих способов, в зависимости от ваших предпочтений и задач.
Вы можете использовать редактор vi
и затем выполнить следующую команду:
:16224,16482w!/tmp/some-file
Также можно сделать это с помощью команды:
cat file | head -n 16482 | tail -n 258
EDIT: Чтобы пояснить, команда head -n 16482 выводит первые 16482 строки, а затем команда tail -n 258 извлекает последние 258 строк из этого вывода.
Существует другой подход с использованием awk
:
awk 'NR==16224, NR==16482' файл
Если файл очень большой, имеет смысл использовать exit
после чтения последней нужной строки. Таким образом, программа не будет считывать следующие строки без необходимости:
awk 'NR==16224, NR==16482-1; NR==16482 {print; exit}' файл
awk 'NR==16224, NR==16482; NR==16482 {exit}' файл
Эти команды позволят вам эффективно извлекать нужные строки, минимизируя затраты времени на чтение ненужных данных.
Не стоит переусердствовать с расчетами интервала при использовании комбинации head | tail
.
Вот как получить диапазон "16224 -- 16482" без лишних вычислений:
cat file | head -n +16482 | tail -n +16224
Пояснение:
- Знак
+
в командахhead
иtail
указывает, что нужно "доходить до / начинать с" указанного номера строки считая от начала файла. - Аналогично, знак
-
указывает, что нужно "доходить до / начинать с" указанного номера строки считая от конца файла. - Предложенное решение сначала использует
head
, чтобы 'сохранить все до верхнего числа', а затемtail
, чтобы 'сохранить все от нижнего числа и выше', тем самым определяя наш интересующий диапазон (без необходимости вычислять интервал).
Извлечение имени файла и расширения в Bash
Как изменить цвет вывода echo в Linux
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?
Как получить пароль из оболочки без вывода в терминал?