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

bash 

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.


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.


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

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

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"


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.


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'


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.