Este tutorial fue analizado por expertos para garantizar la veracidad de nuestra esta reseña.
Solución:
cat ./text | awk ' if ( length > x ) x = length; y = $0 END print y '
UPD: resumiendo todos los consejos en los comentarios
awk 'length > max_length max_length = length; longest_line = $0 END print longest_line ' ./text
cat filename | awk ' print length ' | sort -n | tail -1
Grep la primera línea más larga
grep -Em1 "^.$(wc -L
El comando es inusualmente difícil de leer sin práctica porque mezcla la sintaxis de shell y regexp.
Para la explicación, primero usaré un pseudocódigo simplificado. Las líneas que comienzan con ##
no se ejecute en el shell.
Este código simplificado utiliza el nombre de archivo F y omite las comillas y partes de las expresiones regulares para mejorar la legibilidad.
Cómo funciona
El comando tiene dos partes, una grep
- y un wc
invocación:
## grep "^.$( wc -L F )$" F
los wc
se utiliza en una expansión del proceso, $( ... )
por lo que se ejecuta antes grep
. Calcula la longitud de la línea más larga. La sintaxis de expansión de shell es mixed con la sintaxis del patrón de expresión regular de una manera confusa, por lo que descompondré la expansión del proceso:
## wc -L F
42
## grep "^.42$" F
Aquí, la expansión del proceso se reemplazó con el valor que devolvería, creando el grep
línea de comandos que se utiliza. Ahora podemos leer la expresión regular más fácilmente: Coincide exactamente desde inicio (^
) para terminar ($
) de la línea. La expresión entre ellos coincide con cualquier carácter excepto nueva línea, repetido 42 veces. Combinadas, son líneas que constan de exactamente 42 caracteres.
Ahora, volvamos a los comandos de shell reales: El grep
opción -E
(--extended-regexp
) permite no escapar a la para la legibilidad. Opción
-m 1
(--max-count=1
) hace que se detenga después de encontrar la primera línea. los <
en el wc
comando escribe el archivo en su stdin, para evitar wc
imprima el nombre del archivo junto con la longitud.
¿Qué líneas más largas?
Para que los ejemplos sean más legibles con el nombre del archivo dos veces, usaré una variable f
para el nombre de archivo; Cada $f
en el ejemplo podría ser reemplazado por el nombre del archivo.
f="file.txt"
Mostrar la primera línea más larga - la primera línea que es tan larga como la línea más larga:
grep -E -m1 "^.$(wc -L <"$f")$" "$f"
Espectáculo todas las líneas más largas - todas las líneas que son tan largas como la línea más larga:
grep -E "^.$(wc -L <"$f")$" "$f"
Mostrar la última línea más larga - la última línea que es tan larga como la línea más larga:
tac "$f" | grep -E -m1 "^.$(wc -L <"$f")$"
Mostrar la sola línea más larga - la línea más larga es más larga que todas las demás líneas, o falla:
[ $(grep -E "^.$(wc -L <"$f")$" "$f" | wc -l) = 1 ] && grep -E "^.$(wc -L <"$f")$" "$f"
(El último comando es aún más ineficiente que los demás, ya que repite el comando grep completo. Obviamente, debe descomponerse para que la salida de wc
y las líneas escritas por grep
se guardan en variables.
Tenga en cuenta que todas las líneas más largas en realidad pueden ser todas las líneas. Para guardar en una variable, solo se deben conservar las dos primeras líneas).
valoraciones y reseñas
Si eres capaz, tienes el poder dejar un escrito acerca de qué le añadirías a esta sección.