Видаліть перші n рядків великого текстового файлу


63

Мені потрібно видалити перші 42 рядки дампу SQL 2 Гб.

Я знаю, що я можу переглянути перші рядки, використовуючи:

head -n 44 dump.sql

Але чи можна їх редагувати чи видаляти?

Відповіді:


91

Якщо ви хочете просто переглянути рядки з 43-го, ви можете скористатися

tail -n +43 dump.sql

+Знак важливо - без нього, tailбуде друкувати останні 43 рядків замість цього. Альтернативно з 'sed'

sed 1,42d dump.sql

Якщо ви хочете дійсно видалити перші 42 рядки з оригінального файлу, ви можете зробити sed внести зміни замість цього -iпараметра

sed -i 1,42d dump.sql

Дивовижна відповідь, фантастичне використання tail. Я багато разів знаходив щось нове, щоб дізнатися з ваших відповідей. Дякую.
souravc

1
Ой людина хвіст -n +43 - це зміна гри! Я використовував незручне викликання sed до того ж ефекту.
pfctdayelise

4
Що робити, якщо у вас не залишилося місця на пристрої? sed -i 1,50000000d 17GigFileстворює тимчасовий файл, sedXYZякий споживає набагато більше гігабайт. Чи існує підхід без тимчасових файлів?
juanmf

Яка різниця між tail -n +43і head -n 44як зазначено у питанні?
Хашим

@juanmf Ви можете спробувати це зробити за допомогою інструменту gui (я робив це за допомогою миші, але цікавий файл був "лише" ~ 700 Мб. Хоча деякий час завантажується файл, хоча ...
Digger

18

Це здається найпростішим:

sed '1,42d' test.sql > test2.sql

Видаліть рядки 1-42 з test.sql і збережіть як test2.sql


9
коротший буде sed -i '1,42d' test.sql, якщо вам не потрібно зберігати вихідний файл.
Саді


3

Ви можете використовувати Vim в режимі Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 перейти до першого рядка

  2. 42 виберіть 42 рядки

  3. d видалити

  4. x зберегти і закрити


1
Чи створюється він тимчасовий файл? Чи можливо це зробити, коли на пристрої залишилось місця менше розміру файлу?
juanmf

2
@juanmf Усі ці рішення потребують тимчасового файлу. Видалити дані можна лише з кінця файлу, не використовуючи тимчасовий файл.
PerlDuck

0

На жаль, наразі не можу дати вам фактичний код. Однак спробуйте подивитися щось на зразок

tail -n arcv(`wc -l`) -44

Що слід зробити (після правильного форматування) - підрахувати кількість рядків у файлі (wc-l), відняти з нього 44 (-44), а потім роздрукувати все, починаючи з 45-го рядка у файлі.

Сподіваюся, що це допомагає і удачі.


Це не зовсім оптимальним, викликаючи wc -lна файл, обробити його в два рази, в той час як sedі tailобробляти його тільки один раз.
йо

0

Спробуйте це,

head -n 42 dump.sql > tmp; cat dump.sql | grep -vxf tmp > dump.sql.new; rm tmp

або,

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new

0

Просто, щоб додати це. Якщо ви перебуваєте на Mac, вам потрібно додати розширення для резервного копіювання. Відповідь з цієї публікації .

sed -i '.bak' 1,42d dump.sql

0

Через sedрозбіжності в Linux та Mac я вирішив використовувати tail -n +43 dump.sql > dump.sqlформат.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.