sed как удалить первые 17 строк и последние 8 строк в файле
у меня есть большой файл 150GB CSV-файл, и я хотел бы удалить первые 17 строк и последние 8 строк. Я пробовал следующее, Но кажется, что это не работает правильно
sed -i -n -e :a -e '1,8!{P;N;D;};N;ba'
и
sed -i '1,17d'
мне интересно, если кто-то может помочь с sed или awk, один лайнер будет большой?
7 ответов
Try this :
sed '{[/]<n>|<string>|<regex>[/]}d' <fileName>
sed '{[/]<adr1>[,<adr2>][/]d' <fileName>
здесь
/.../=разделители
n = номер строки
string = строка, найденная в строке
regex = регулярное выражение, соответствующее искомому шаблону
addr = адрес строки (номер или шаблон )
d = удалить
передать этот ссылке
LENGTH=`wc -l < file`
head -n $((LENGTH-8)) file | tail -n $((LENGTH-17)) > file
Edit: как mtk опубликовал в комментарии, это не сработает. Если вы хотите использовать wc
и длина файла трека вы должны использовать:
LENGTH=`wc -l < file`
head -n $((LENGTH-8)) file | tail -n $((LENGTH-8-17)) > file
или:
LENGTH=`wc -l < file`
head -n $((LENGTH-8)) file > file
LENGTH=`wc -l < file`
tail -n $((LENGTH-17)) file > file
что делает это решение менее элегантным, чем то, что опубликовано choroba:)
я узнал это сегодня для раковины.
{
ghead -17 > /dev/null
sed -n -e :a -e '1,8!{P;N;D;};N;ba'
} < my-bigfile > subset-of
нужно использовать не потреблял head
, следовательно, использование ghead
из GNU coreutils.
аналогично Тора, но немного короче:
sed -i '' -e $'1,17d;:a\nN;19,25ba\nP;D' file.txt
на -i ''
говорит sed редактировать файл на месте. (Синтаксис может немного отличаться в вашей системе. Проверьте справочную страницу.)
если вы хотите удалить front
линии фронта и tail
С конца вам придется использовать следующие цифры:
1,{front}d;:a\nN;{front+2},{front+tail}ba\nP;D
(Я поставил их в фигурные скобки здесь, но это просто псевдокод. Вам придется заменить их на фактические числа. Кроме того, он должен работать с {front+1}
, но это не на моей машине (macOS 10.12.4). Я думаю, это ошибка.)
я попытаюсь объяснить, как работает команда. Вот читаемая человеком версия:
1,17d # delete lines 1 ... 17, goto start
:a # define label a
N # add next line from file to buffer, quit if at end of file
19,25ba # if line number is 19 ... 25, goto start (label a)
P # print first line in buffer
D # delete first line from buffer, go back to start
Сначала мы пропускаем 17 линий. Это просто. Остальное сложно, но в основном мы держим буфер из восьми строк. Мы только начинаем печатать строки, когда буфер заполнен, но мы останавливаем печать, когда достигаем конца файла, поэтому в конце все еще остается восемь строк в буфере, который мы не печатали-другими словами, мы удалили их.