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 ответов


awk -v nr="$(wc -l < file)" 'NR>17 && NR<(nr-8)' file

head и tail лучше, чем sed или awk.

tail -n+18 file | head -n-8 > newfile

все awk:

awk 'NR>y+x{print A[NR%y]} {A[NR%y]=}' x=17 y=8 file

Try this :

sed '{[/]<n>|<string>|<regex>[/]}d' <fileName>       
sed '{[/]<adr1>[,<adr2>][/]d' <fileName>

здесь

  1. /.../=разделители

  2. n = номер строки

  3. string = строка, найденная в строке

  4. regex = регулярное выражение, соответствующее искомому шаблону

  5. addr = адрес строки (номер или шаблон )

  6. 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 линий. Это просто. Остальное сложно, но в основном мы держим буфер из восьми строк. Мы только начинаем печатать строки, когда буфер заполнен, но мы останавливаем печать, когда достигаем конца файла, поэтому в конце все еще остается восемь строк в буфере, который мы не печатали-другими словами, мы удалили их.