Показуйте лише непарні лінії з кіткою


28

ПРИВІТ,

певно, це щось дуже легко, але я зараз не розумію. У Linux, оболонці, даному текстовому файлі, як я можу зробити щось на кшталт cat filename, щоб я бачив лише перший рядок, третій рядок, 5, 7, 9 тощо?

якщо не з котом, то з іншою командою

Спасибі

bash 

Відповіді:


42

Використання awk:awk 'NR % 2 == 0' filename

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


1
{print}є типовою дією, тому awk 'NR % 2 == 0' < myfileдостатньо.

3
@roberto, не потрібно перенаправлення вводу.
користувач31894

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 ім'я файлу", і це, здається, працює також. --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.