Mostrar solo líneas impares con gato

28

HOLA,

probablemente es algo muy fácil, pero no entiendo ahora. En Linux, shell, dado un archivo de texto, ¿cómo puedo hacer algo como el nombre de archivo del gato para que solo vea la primera línea, la tercera línea, 5, 7, 9 y así sucesivamente?

si no con gato, con otro comando

Gracias


fuente

Respuestas:

42

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

Editar: eliminado {print}, como se muestra en la respuesta de ghostdog74 y comentado por Roberto Bonvallet.

Chris Johnsen
fuente
1
{print}es la acción predeterminada, por lo que awk 'NR % 2 == 0' < myfilees suficiente.
3
@roberto, no necesito la redirección de entrada.
user31894
1
Solo como una nota, esto muestra líneas pares (donde la primera línea es 1) y líneas impares (si piensa en la primera línea como 0). Reemplazar 2 == 0con 2 == 1por lo contrario.
cde
13

O algo como

sed -n 'p;n' filename

Para obtener una explicación, busque la página del manual sed.

Adobe
fuente
Esta es la sedversión portátil que se me pasó por la cabeza.
Chris Johnsen
1
puede omitir fácilmente las líneas por adelantado sed -n '1d;p;n'para las líneas pares, por ejemplo
kisp
7

Use sed:

sed -n 1~2p filename
Andrew Dyster
fuente
1
Esta es una extensión de GNU. Es posible que no funcione en sistemas donde GNU sedno es el predeterminado.
Chris Johnsen
Es cierto, pero debería funcionar con la mayoría de los sabores de Linux
Hmm ... acabo de probar "sed --posix -n 1 ~ 2p filename" y parece que también funciona. Se supone que --posix elimina el soporte para extensiones gnu.
El sedmanual GNU gnu.org/software/sed/manual/html_node/Addresses.html#Addresses dice "primer ~ paso Esta extensión GNU ...". No lo menciona --posix. Cuando lo intento gsed --posix -n 1~2p(GNU sed 4.2.1), me sale gsed: -e expression #1, char 2: unknown command: ‘~’.
Chris Johnsen
Ok ... tiene sentido. No sé qué le pasa a mi sed. Estoy usando cygwin, así que eso podría tener algo que ver con eso.
2
awk '{if(NR%2!=0)print}' myfile
Mouviciel
fuente
2

2 formas de hacerlo con awk

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

O solo con el caparazón

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

No he probado esto (no parece funcionar en Mac OS X), pero GNU sed admite first~stepcomo una selección de dirección, por ejemplo:

sed -n 1~2p file

comenzaría en la primera línea e imprimiría cualquier otra línea después de eso.


fuente
Correcto, esta es una extensión de GNU. Mac OS X usa un BSD seden la instalación base.
Chris Johnsen
-2

Puede usar estos comandos para requerir resultado

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'

AAKANKSHA JAIN
fuente
2
-1. Esto duplica las respuestas de hace casi 10 años, las diferencias menores no se explican en absoluto. ¿Y por qué está ls -laquí?
Kamil Maciorowski