awk - ¿Cómo imprimir el número de caracteres para las primeras n líneas en un archivo?


10

Tengo un comando:

$ awk '{ print length($0); }' /etc/passwd

Imprime el número de caracteres de cada línea en un archivo passwd :

52
52
61
48
81
58
etc.

¿Cómo puedo imprimir el número de caracteres solo para las primeras n líneas?

Por ejemplo, para las primeras 3 líneas daría algo como:

52
52
61

@ilkkachu cierto.
njzk2

Si desea ignorar el espacio en blanco como, utilice a continuación - awk '(NR<=line) && length($0) {print length($0)}' line=3 file
VIPIN KUMAR

Respuestas:


17

Indique awkque salga cuando se hayan leído suficientes líneas:

awk '$0 = length; NR==3 { exit }' /etc/passwd

Tenga en cuenta que esta solución ignora las líneas vacías, aunque no para el recuento de líneas.


complicado y genial! (+1)

2
Si alguna de las líneas está vacía, la asignación se evalúa a cero (un valor falso) y la longitud no se imprimirá.
ilkkachu

@ilkkachu: Dependiendo de la situación, sería razonable ignorar las líneas vacías. He agregado una nota sobre esto.
Thor

14

Una versión Awk directa (no tan eficiente como la de @ Thor), pero un poco más clara:

awk 'NR <= 3 {print length}' /etc/passwd

3
Si esto fuera así awk '{ print length } NR>=3 { exit }' /etc/passwd, lo votaría.
Pausado hasta nuevo aviso.

3
@DennisWilliamson, gracias. Esa es una muy buena sugerencia, no la incluiré en mi respuesta porque ya está implícita en la propuesta de Thor.

5

Puede ejecutarlo solo con awkun comando, como lo describen @Thor y @JJoao (+1 de mi parte)

Puede combinar awky headcon el -nsiguiente parámetro el número de líneas como se describe a continuación:

Gracias por la sugerencia de @Maerlyn para ejecutar en este orden: head | awk

Por ejemplo, obtendrá las primeras 3 líneas usando:

head -n3 /etc/passwd | awk '{ print length($0); }' 

hombre jefe

-n, --lines=[-]K
    print the first K lines instead of the first 10; with the leading '-', print all but the last K lines of each file 

@ msjavx86 - genial :) por favor acepte la respuesta, cuando pueda hacerlo
Yaron

por supuesto que lo haré, en unos 10 minutos;) gracias de nuevo!
bambosze_babuni

8
Tal vez incluso al revés, head -n3 /etc/passwd | awkpara que awk no tenga que procesar todo el archivo.
Maerlyn

1
AWK puede contar líneas, no es necesario head.
Pausado hasta nuevo aviso.

@DennisWilliamson: gracias por el comentario, usar headfue la primera solución de trabajo que se me ocurrió. He votado a @Thor, a la respuesta de @JJoao que usa awksolo una solución.
Yaron
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.