6

Как извлечь заранее заданный диапазон строк из текстового файла в Unix?

6

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

Кто-нибудь знает команду Unix (или серию команд), которая позволит извлечь все строки из файла между, скажем, строками 16224 и 16482, а затем перенаправить их в новый файл?

5 ответ(ов)

2

Команда sed -n '16224,16482 p' orig-data-file > new-file используется для извлечения определенного диапазона строк из файла. В данном случае числа 16224 и 16482 указывают на начальный и конечный номера строки, которые нужно извлечь (включительно). Обратите внимание, что нумерация строк здесь начинается с единицы.

Опция -n подавляет вывод всех строк, что позволяет вам избежать вывода ненужной информации. Команда p в данном случае указывает sed напечатать только те строки, которые попадают в указанный диапазон.

Таким образом, после выполнения этой команды строки с номерами от 16224 до 16482 из файла orig-data-file будут записаны в файл new-file.

1

Для извлечения определенного диапазона строк из файла in.sql и записи их в out.sql можно использовать несколько команд.

  1. С помощью head и tail:
head -16482 in.sql | tail -258 > out.sql

Эта команда сначала выводит первые 16482 строки из файла, а затем передает вывод в tail, который выбирает последние 258 строк из этого результата и записывает их в out.sql.

  1. С помощью sed:
sed -n '16224,16482p' in.sql > out.sql

Здесь sed используется с параметром -n, который подавляет вывод, и командой p, которая печатает только строки с 16224 по 16482.

  1. С помощью awk:
awk 'NR>=16224&&NR<=16482' in.sql > out.sql

В этом примере awk проверяет номер текущей строки (NR) и выводит только те строки, которые находятся в диапазоне от 16224 до 16482, записывая их в out.sql.

Выберите любой из этих способов, в зависимости от ваших предпочтений и задач.

0

Вы можете использовать редактор vi и затем выполнить следующую команду:

:16224,16482w!/tmp/some-file

Также можно сделать это с помощью команды:

cat file | head -n 16482 | tail -n 258

EDIT: Чтобы пояснить, команда head -n 16482 выводит первые 16482 строки, а затем команда tail -n 258 извлекает последние 258 строк из этого вывода.

0

Существует другой подход с использованием 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}' файл

Эти команды позволят вам эффективно извлекать нужные строки, минимизируя затраты времени на чтение ненужных данных.

0

Не стоит переусердствовать с расчетами интервала при использовании комбинации head | tail.

Вот как получить диапазон "16224 -- 16482" без лишних вычислений:

cat file | head -n +16482 | tail -n +16224

Пояснение:

  • Знак + в командах head и tail указывает, что нужно "доходить до / начинать с" указанного номера строки считая от начала файла.
  • Аналогично, знак - указывает, что нужно "доходить до / начинать с" указанного номера строки считая от конца файла.
  • Предложенное решение сначала использует head, чтобы 'сохранить все до верхнего числа', а затем tail, чтобы 'сохранить все от нижнего числа и выше', тем самым определяя наш интересующий диапазон (без необходимости вычислять интервал).
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь