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

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

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

head -n 44 dump.sql

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

62
задан 06.05.2020, 21:44

8 ответов

Это кажется самым простым:

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

Удалите строки 1-42 из test.sql и сохраните как test2.sql

18
ответ дан 06.05.2020, 21:48
  • 1
    более короткий был бы sed-i ' 1,42d' test.sql, если Вы don' t должен сохранить исходный файл. – Janusz 06.05.2020, 21:48

Просто чтобы добавить это. Если вы используете Mac, вам нужно добавить расширение для резервного копирования. Ответ из этого поста .

sed -i '.bak' 1,42d dump.sql
0
ответ дан 06.05.2020, 21:44

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

tail -n +43 dump.sql

Знак + важен - без него tail напечатает последние 43 строки вместо. В качестве альтернативы с помощью «sed»

sed 1,42d dump.sql

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

sed -i 1,42d dump.sql
90
ответ дан 06.05.2020, 21:45
  • 1
    @juanmf Вы могли бы попытаться сделать это с gui инструментом (I' ve, сделанный, это с помощью Коврика для мыши, но файла интереса был " only" ~700MB. Берет некоторое время, чтобы файл загрузился, хотя... – Khawar Raza 06.05.2020, 21:45
  • 2
    What' s различие между tail -n +43 и head -n 44, как упомянуто в вопросе? – brijexecon 06.05.2020, 21:45
  • 3
    Что, если Вы не имеете пространства в запасе на устройстве? sed -i 1,50000000d 17GigFile создает временный файл sedXYZ, который использует намного больше гигабайтов. Существует ли подход без временных файлов? – BoD 06.05.2020, 21:46
  • 4
    О, хвост человека-n +43 является переломным моментом! I' ve, с помощью неловкого вызова sed к тому же эффекту. – Xar E Ahmer 06.05.2020, 21:46
  • 5
    Потрясающий ответ, фантастическое использование tail. Я много раз находил, что что-то новое узнало из Ваших ответов. спасибо. – Sunil 06.05.2020, 21:47

попробуйте это,

tail -n +43 dump.sql > dump_new.sql

10
ответ дан 06.05.2020, 21:45

Извините, я не могу дать вам текущий код прямо сейчас. Однако попробуйте взглянуть на что-то вроде

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

. Что нужно сделать (после правильного форматирования) - это подсчитать количество строк в файле (wc -l), вычесть из него 44 (-44 ), а затем распечатайте все, начиная с 45-й строки в файле.

Надеюсь, это поможет и удачи.

0
ответ дан 06.05.2020, 21:46
  • 1
    Это не совсем оптимально, звоня wc -l на файле, Вы обрабатываете его дважды, тогда как sed или tail процесс он только однажды. – Yitzchak 06.05.2020, 21:46

Попробуйте,

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
ответ дан 06.05.2020, 21:47

Попробуйте,

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
ответ дан 06.05.2020, 21:47

Вы можете использовать Vim в режиме Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 перейти к первой строке

  2. 42 выбрать 42 линии

  3. d удалить

  4. x сохранить и закрыть

3
ответ дан 06.05.2020, 21:47
  • 1
    Это создает временный файл? Действительно ли возможно сделать это, когда пространство, оставленное на устройстве, является меньше, чем размер файла? – S E 06.05.2020, 21:48
  • 2
    @juanmf Все эти решения требуют временного файла. Только возможно удалить данные от конец из файла, не используя временный файл. – Wanbok Choi 06.05.2020, 21:48

Теги

Похожие вопросы