Как убрать все остальные строки с помощью sed? - PullRequest
39 голосов
/ 01 апреля 2010

Как я могу удалить каждую нечетную строку, используя sed?

remove
keep
remove
keep
remove
...

Ответы [ 5 ]

66 голосов
/ 01 апреля 2010

GNU sed имеет подходящий режим адресации:

sed -n '1~2!p' file

, что означает, начиная со строки 1 и с шага 2, печатать все остальные строки.

Эквивалентно, вы можете удалить -n и удалить соответствующие строки:

sed '1~2d'

Это также можно сделать с помощью awk:

awk 'NR%2==0' file

(если номер строки кратен 2, выведите строку)

36 голосов
/ 01 апреля 2010

Вот самое короткое, о чем я могу подумать:

sed -n 'g;n;p' file

Должно работать с не-GNU версиями sed (а также с GNU sed).

5 голосов
/ 30 июля 2018

Работает с GNU и BSD (mac) версиями sed:

Чтобы удалить нечетные строки (вывести четные строки):

sed -n ’n;p’ file

Может показаться немного запутанным, поэтому вот что происходит под капотом шаг за шагом:

  1. sed: читает в первой строке
  2. -n: подавить вывод первой строки
  3. n: вывод подавлен, поэтому ничего не записывайте
  4. n (снова): прочитать следующую (вторую) строку в буфере паттернов, то есть немедленно обработать
  5. p: вывести все, что доступно в буфере шаблонов, переопределяя подавленный вывод, т. Е. 2-я строка
  6. sed: читает в третьей строке, так как вторая строка уже обработана благодаря «n» в шаге 4
  7. -n: подавить вывод третьей строки
  8. ...
  9. ...

Чтобы удалить четные строки (вывести нечетные строки):

sed -n ‘p;n’ file

Вот что алгоритмически происходит под капотом:

  1. sed: читает в первой строке
  2. -n: подавить вывод первой строки
  3. p: печатает содержимое буфера шаблонов, то есть первую строку, переопределяя подавленный вывод
  4. n: вывод подавлен, поэтому ничего не записывайте
  5. n (снова): чтение следующей (второй) строки в буфер шаблонов для немедленной обработки, но, поскольку больше нет команд, ничего не происходит
  6. sed: читает в третьей строке, так как вторая строка уже «обработана» благодаря «n» на шаге 5
  7. -n: подавить вывод третьей строки
  8. p: печатает третью строку с подавленным выводом
  9. ...
4 голосов
/ 11 сентября 2015

Perl решение:

perl -ne 'print if $. % 2 == 0' file

$. - номер строки

2 голосов
/ 16 марта 2013

Еще один awk:

awk getline file
...