У меня есть дамп SQL ~ 23000 строк, содержащий несколько баз данных данных. Мне нужно извлечь определенный раздел этого файла (то есть данные для одной базы данных) и поместить его в новый файл. Я знаю номера начала и конца строки нужных мне данных.
Кто-нибудь знает команду Unix (или серию команд), чтобы извлечь все строки из файла, скажем, между строками 16224 и 16482, а затем перенаправить их в новый файл?
unix
command-line
sed
text-processing
Адам Дж. Форстер
источник
источник
Ответы:
Из руководства пользователя sed :
а также
источник
sed -n '16224,16482p;16483q' filename
. В противном случае sed продолжит сканирование до конца (или, по крайней мере, моя версия).Где 16224,16482 - номер начальной и конечной строки включительно. Это 1-индексированный.
-n
подавляет эхо ввода как вывод, который вам явно не нужен; числа указывают диапазон строк, на которых должна работать следующая команда; командаp
выводит соответствующие строки.источник
sed -n '16224,16482p;16482q' orig-data-file > new-file
.Довольно просто, используя голову / хвост:
используя sed:
используя awk:
источник
tail
.sed -n 16224,16482p' in.sql >out.sql
а команда awk должна бытьawk 'NR>=16224&&NR<=16482' in.sql > out.sql
head -16482 in.sql | tail -$((16482-16224)) >out.sql
вычисление сводится к bashtail -n +16224
для сокращения вычисленийВы можете использовать 'vi' и затем следующую команду:
В качестве альтернативы:
РЕДАКТИРОВАТЬ: - Просто чтобы добавить объяснение, вы используете head -n 16482 для отображения первых 16482 строк, а затем с помощью tail -n 258, чтобы получить последние 258 строк из первого вывода.
источник
cat
команда;head
можете прочитать файл напрямую. Это медленнее, чем многие альтернативы, потому что он использует 2 (3, как показано) команды, где 1 достаточно.cat
). Другие решения требуют как минимум несколько минут. Также кажется, что самая быстрая вариация на GNUtail -n +XXX filename | head XXX
.Есть еще один подход с
awk
:Если файл огромен, это может быть полезно
exit
после прочтения последней нужной строки. Таким образом, он не будет читать следующие строки без необходимости:источник
print; exit
. Спасибо !awk 'NR==16224, NR==16482; NR==16482 {exit}' file
источник
источник
должен сделать свое дело. Недостатком этого подхода является то, что вам нужно выполнить арифметику, чтобы определить аргумент для tail и учесть, хотите ли вы, чтобы между ними была добавлена конечная строка или нет.
источник
cat
команда;head
можете прочитать файл напрямую. Это медленнее, чем многие альтернативы, потому что он использует 2 (3, как показано) команды, где 1 достаточно.| tail -$((16482 - 16224))
.Стоя на плечах boxxar, мне нравится это:
например
В
$
означает «последняя строка», поэтому первая команда делаетsed
печать всех строк , начиная с линии ,16224
а вторая команда позволяетsed
выйти после печати строки16428
. (Добавление1
кq
-range в растворе boxxar по - видимому, не требуется.)Мне нравится этот вариант, потому что мне не нужно указывать номер конечной строки дважды. И я измерил, что использование
$
не оказывает вредного влияния на производительность.источник
sed -n '16224,16482p' < dump.sql
источник
Быстро и грязно:
Вероятно, не лучший способ сделать это, но это должно работать.
Кстати: 259 = 16482-16224 + 1.
источник
Я написал программу на Haskell под названием splitter, которая делает именно это: прочитайте мою публикацию в блоге .
Вы можете использовать программу следующим образом:
И это все, что нужно сделать. Вам понадобится Haskell для его установки. Просто:
И вы сделали. Я надеюсь, что вы найдете эту программу полезной.
источник
splitter
только со стандартного ввода? В некотором смысле это не имеет значения;cat
команда является излишней , имеет ли он или нет. Либо используйте,splitter 16224-16482 < somefile
либо (если он принимает аргументы имени файла)splitter 16224-16482 somefile
.Даже мы можем сделать это, чтобы проверить в командной строке:
Например:
источник
cat
команда ни в одном из них;sed
отлично способен читать файлы самостоятельно, или вы можете перенаправить стандартный ввод из файла.Используя ruby:
источник
Я собирался опубликовать трюк с головой / хвостом, но на самом деле я бы просто запустил Emacs. ;-)
откройте новый выходной файл, ctl-y сохраните
Давайте посмотрим, что происходит.
источник
Я хотел бы использовать:
FNR содержит номер записи (строки) строки, читаемой из файла.
источник
Я хотел сделать то же самое из сценария, использующего переменную, и достиг этого, поместив кавычки вокруг переменной $, чтобы отделить имя переменной от p:
Я хотел разделить список на отдельные папки, нашел начальный вопрос и ответил на полезный шаг. (команда split не является опцией на старой ОС, я должен перенести код на).
источник
Я написал небольшой bash-скрипт, который вы можете запустить из командной строки, если вы обновите свой PATH, включив в него его каталог (или вы можете поместить его в каталог, который уже содержится в PATH).
Использование: $ pinch filename start-line end-line
источник
wc
команды, которая тратит пропускную способность диска, особенно на гигабайтные файлы. Во всех отношениях это хорошо документировано, но это также излишнее инженерное решение.Это может работать для вас (GNU sed):
или воспользоваться bash:
источник
Используя ed:
-s
подавляет диагностический вывод; фактические команды в строке здесь. В частности,16224,16482p
запускает командуp
(печать) в нужном диапазоне адресов строк.источник
Работа с ключами -n в ответах. Вот другой способ, если вы склонны.
Это делает следующее:
источник
cat file | sed
лучше написана какsed file
Поскольку мы говорим о выделении строк текста из текстового файла, я приведу специальный случай, когда вы хотите извлечь все строки, которые соответствуют определенному шаблону.
Напечатает строку [Данные] и остальные. Если вы хотите, чтобы текст из строки 1 соответствовал шаблону, введите: sed -n '1, / Data / p' myfile. Кроме того, если вы знаете два шаблона (лучше быть уникальными в вашем тексте), как начальная, так и конечная линия диапазона могут быть указаны с совпадениями.
источник