encontrar la longitud de la línea más larga en todos los archivos de texto en un directorio


16

Sé cómo obtener la longitud de la línea más larga en un archivo de texto con awk

awk ' { if ( length > L ) { L=length} }END{ print L}' file.txt

pero, ¿cómo puedo obtener la longitud de la línea más larga de todos los archivos en un directorio?

Respuestas:


11

La solución más sencilla es concatenar todos los archivos y canalizar el resultado a su script:

cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'

También puede pasar directamente varios archivos a awk:

awk '{ if ( length > L ) { L=length} }END{ print L}' ./*

Por supuesto, puede haber algunas advertencias si los archivos son en realidad directorios, pero debería ser inofensivo. Puede tener mayores problemas con los archivos binarios porque no tienen un concepto de línea . Entonces, para ser más específicos, puedes hacer algo como

 awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt

para que coincida solo con el .txt archivos en el directorio actual.

Y, como dijo @ G-Man en su comentario, *no coincidirá con los archivos ocultos (comenzando con un punto). Si quieres esos, úsalos * .*.


O, posiblemente, cat * .* | .... O eliminar el uso inútil del gato y decir awk '...' * .*.
G-Man dice 'Restablecer a Mónica'

@ G-Man De hecho. Estaba editando mi respuesta sobre eso cuando comentaste. :-) Lo dije más directamente porque concatenar los archivos con cat es lo que parecía más simple al principio.
lgeorget

4

Con GNU wc:

cat *.txt|wc -L

-L imprime la longitud de la línea más larga.


4

Si desea la longitud máxima por archivo, con GNU awk:

find . -type f -exec awk -v l=0 '
   length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +

O la longitud máxima en todos los archivos:

find . -type f -size +1c -exec cat {} + |
  awk -v l=0 'length>l {l=length}; END{print l}'

Eso supone que los archivos terminan en caracteres de nueva línea. Si un archivo no termina en un carácter de nueva línea, su última línea no delimitada se fusionará con la primera línea del siguiente archivo y posiblemente anule su resultado.

-size +1c es una optimización ya que los archivos de texto que están vacíos o que contienen un solo carácter tienen respectivamente 0 líneas y 1 línea vacía, por lo que no tendrán la línea más larga.


Son archivos de texto, por lo que terminan en caracteres de nueva línea (a menos que estén vacíos).
Gilles 'SO- deja de ser malvado'

0

También con GNU wc (coreutils 8.4), puede manejar múltiples archivos

wc -L *.txt
  • enumera la longitud de cada archivo individual
  • así como proporcionar la mayor longitud de todos los archivos

Esto es esencialmente lo que hace esta otra respuesta que menciona wc -L, pero su solución tiene la desventaja de que primero debe atravesar la longitud máxima de todos los demás archivos. ¿Hay alguna ventaja en eso?
Anthon
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.