2010-04-01 3 views
29

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

remove 
keep 
remove 
keep 
remove 
... 
+0

Половина вопросов сегодня утром, кажется, первоапрельских шуток, а также ... – Will

+0

Если это апрельский дурак, тогда ответ должен быть: grep Не input.txt – paxdiablo

+0

@paxdiablo: А как насчет 'grep -v Remove'? – Cascabel

ответ

51

ГНУ СЭД имеет подходящий режим адресации:

sed -n '1~2!p' file 

, что означает, начиная с линии 1, и с шагом 2, печать всех других линий.

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

sed '1~2d' 

Она также может быть сделано с помощью AWK:

awk 'NR%2==0' file 

(Всякий раз, когда номер строки кратна 2, печать линия)

+0

Спасибо за это! очень полезно. –

+1

Я получаю ошибку «недопустимый код команды ~», когда я пытаюсь это сделать с sed на macos. –

31

Краткая информация о том, как я могу думать о:

sed -n 'g;n;p' file 

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

+4

+1 для портативности –

+3

Это работает и на OS X! (В отличие от 'sed -n '1 ~ 2! P''.) Он берет линии 2,4,6, ... Я не мог понять из справочной страницы, как брать строки 1,3,5, .. Однако добавление первой строки - простой взлом. – Nagel

+7

@Nagel: Попробуйте: 'sed -n 'p; n' file' или' sed 'n; d' file' для вывода нечетных строк. Кстати, я не думаю, что 'g' необходимо для вывода четных строк:' sed -n 'n; p' file', похоже, работает. –

3

решение Perl:

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

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

+0

Парень попросил 'sed', который показывает ваши навыки чтения с вашей стороны, но кто-то может найти это полезным, поэтому +1. –

+1

Я ответил, так как sed, awk и perl часто могут использоваться взаимозаменяемо. Несмотря на различия в скорости и простоте, все они используются в командной строке или внутри сценариев оболочки. –

Смежные вопросы