Показывать только нечетные строки с котом


28

ЗДРАВСТВУЙ,

Возможно, это что-то очень простое, но я не понимаю сейчас. В Linux shell, учитывая текстовый файл, как я могу сделать что-то вроде cat filename, чтобы я видел только первую строку, третью строку, 5, 7, 9 и так далее?

если не с кошкой, с другой командой

Благодарность

bash 

Ответы:


42

Использование awk:awk 'NR % 2 == 0' filename

Редактировать: удалено {print}, как показано в ответе ghostdog74 и прокомментировано Роберто Бонваллетом.


1
{print}это действие по умолчанию, так awk 'NR % 2 == 0' < myfileчто достаточно.

3
@roberto, не нужно перенаправление ввода.
user31894

1
Как примечание, это показывает четные линии (где первая строка равна 1) и нечетные линии (если вы думаете о первой строке как 0). Заменить 2 == 0с 2 == 1на противоположное.
CDE

13

Или что-то вроде

sed -n 'p;n' filename

Для объяснения посмотрите справочную страницу для sed.


Это портативная sedверсия, которая пришла мне в голову.
Крис Джонсен

1
например, вы можете легко пропустить строки заранее sed -n '1d;p;n'для четных строк
kisp

7

Используйте sed:

sed -n 1~2p filename

1
Это расширение GNU. Может не работать в системах, где GNU sedне используется по умолчанию.
Крис Джонсен

Правда, но должен работать с большинством разновидностей Linux

Хм .. Я только что попробовал "sed --posix -n 1 ~ 2p filename", и это, похоже, тоже работает. Предполагается, что --posix удаляет поддержку расширений gnu.

В sedруководстве GNU gnu.org/software/sed/manual/html_node/Addresses.html#Addresses говорится «первый шаг Это расширение GNU…». Это не упоминает --posix. Когда я пытаюсь gsed --posix -n 1~2p(GNU sed 4.2.1), я получаю gsed: -e expression #1, char 2: unknown command: ‘~’.
Крис Джонсен

Хорошо .. имеет смысл. Не знаю, что не так с моим седом. Я использую Cygwin, так что это может быть как-то связано с этим.


2

2 способа сделать это с помощью awk

$ awk '{getline;print}' file # the equivalent of the selected sed answer
$ awk 'NR%2==0' file

ИЛИ только с оболочкой

i=1; while read -r line; do [ $((i++ % 2)) -eq 0 ] && echo $line; done <"file"


0

Не проверял это (кажется, не работает на Mac OS X), но GNU sed поддерживает first~stepв качестве выбора адреса, например, так:

sed -n 1~2p file

будет начинаться с первой строки и печатать все остальные строки после этого.


Правильно, это расширение GNU. Mac OS X использует BSD sedв базовой установке.
Крис Джонсен


-2

Вы можете использовать эти команды для получения требуемого результата

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'


2
-1. Это дублирует ответы почти 10 лет назад, незначительные различия не объясняются вообще. И почему ls -lздесь?
Камиль Мачоровский
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.