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

28

ЗДРАВСТВУЙ,

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

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

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


источник

Ответы:

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"
user31894
источник
0

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

sed -n 1~2p file

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


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

Невозможно проверить, нашел ссылку: cat -n $ 1 | grep "$ ODDRE" | cut -b 8-> oddfile. $$

Франциско Акино
источник
Вы упустили самое важное ... что ODDREустановлено. Но этот ответ будет работать, только если файл меньше миллиона строк.
Эндрю МакГрегор
-2

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

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'

AAKANKSHA JAIN
источник
2
-1. Это дублирует ответы почти 10 лет назад, незначительные различия не объясняются вообще. И почему ls -lздесь?
Камиль Мачоровский