Удалить первые n строк большого текстового файла


63

Мне нужно удалить первые 42 строки дамп SQL объемом 2 ГБ.

Я знаю, что могу просмотреть первые строки, используя:

head -n 44 dump.sql

Но есть ли способ их отредактировать или удалить?

Ответы:


91

Если вы хотите просто просмотреть строки с 43-го на вы можете использовать

tail -n +43 dump.sql

+Знак важно - без него, tailбудет печатать последние 43 строк вместо этого. Альтернативно с «седь»

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который потребляет гораздо больше гигабайт. Есть ли подход без временных файлов?
августа

В чем разница между tail -n +43и head -n 44как упоминалось в вопросе?
Хашим

@juanmf Вы можете попытаться сделать это с помощью графического инструмента (я сделал это с помощью коврика для мыши, но интересующий файл был «всего» ~ 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
Создает ли временный файл? Возможно ли это сделать, когда на устройстве осталось меньше размера файла?
июня

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.