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


fonte

Respostas:

40

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

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

Chris Johnsen
fonte
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.

Adobe
fonte
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
Andrew Dyster
fonte
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
awk '{if(NR%2!=0)print}' myfile
mouviciel
fonte
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"
user31894
fonte
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.


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

Não foi possível testar, localizou um link: cat -n $ 1 | grep "$ ODDRE" | cut -b 8-> oddfile. $$

Francisco Aquino
fonte
Você perdeu a coisa mais importante ... o que ODDREestá definido. Mas essa resposta só funcionará se o arquivo tiver menos de um milhão de linhas.
Andrew McGregor
-2

Você pode usar esses comandos para exigir resultados

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'

AAKANKSHA JAIN
fonte
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