Как извлечь заранее заданный диапазон строк из текстового файла в 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, чтобы 'сохранить все от нижнего числа и выше', тем самым определяя наш интересующий диапазон (без необходимости вычислять интервал).
Как изменить цвет вывода echo в Linux
Как работает "cat << EOF" в bash?
Расширение переменных внутри одинарных кавычек в команде Bash
Как разделить большой текстовый файл на меньшие файлы с равным количеством строк?
Автоматический вход в Docker через Bash-скрипт