Mostrar apenas linhas ímpares com gato


27

OI,

provavelmente isso é algo muito fácil, mas eu não entendo o ponto agora. No Linux, shell, dado um arquivo de texto, como posso fazer algo como, nome do arquivo cat, para ver apenas a primeira linha, a terceira linha, 5, 7, 9 e assim por diante?

se não estiver com gato, com outro comando

obrigado

bash 

Respostas:


40

Usando awk:awk 'NR % 2 == 0' filename

Editar: removido {print}, como mostrado na resposta de ghostdog74 e comentado por Roberto Bonvallet.


1
{print}é a ação padrão, por isso awk 'NR % 2 == 0' < myfileé suficiente.

3
@roberto, não precisa do redirecionamento de entrada.
precisa saber é o seguinte

1
Apenas como uma observação, isso mostra linhas pares (onde a primeira linha é 1) e linhas ímpares (se você pensar na primeira linha como 0). Substituir 2 == 0com 2 == 1para a frente.
Cde

13

Ou algo como

sed -n 'p;n' filename

Para obter uma explicação, consulte a página de manual sed.


Esta é a sedversão portátil que me passou pela cabeça.
precisa

1
você pode facilmente pular linhas iniciais com sed -n '1d;p;n'para as linhas até mesmo, por exemplo
kisp

7

Use sed:

sed -n 1~2p filename

1
Esta é uma extensão GNU. Pode não funcionar em sistemas nos quais o GNU sednão é o padrão.
precisa

Verdade, mas deve funcionar com a maioria dos sabores de Linux

Hmm .. Eu apenas tentei "sed --posix -n 1 ~ 2p filename" e isso parece funcionar também. O --posix deve remover o suporte para extensões gnu.

O sedmanual GNU gnu.org/software/sed/manual/html_node/Addresses.html#Addresses diz “primeiro ~ passo Esta extensão GNU…”. Não menciona --posix. Quando tento gsed --posix -n 1~2p(GNU sed 4.2.1), recebo gsed: -e expression #1, char 2: unknown command: ‘~’.
precisa

Ok .. faz sentido. Não sei o que há de errado com o meu sed. Estou usando o cygwin, então isso pode ter algo a ver com isso.


2

2 maneiras de fazer isso com o awk

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

OU com apenas a casca

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


0

Ainda não testei isso (parece não funcionar no Mac OS X), mas o GNU sed suporta first~stepcomo uma seleção de endereço, por exemplo:

sed -n 1~2p file

começaria na primeira linha e imprimiria todas as outras linhas depois disso.


Certo, esta é uma extensão GNU. O Mac OS X usa um BSD sedna instalação base.
precisa


-2

Você pode usar esses comandos para exigir resultados

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'


2
-1. Isso duplica as respostas de quase 10 anos atrás, pequenas diferenças não são explicadas. E por que está ls -laqui?
Kamil Maciorowski
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.