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?

trupty
fuente

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 * .*.

lgeorget
fuente
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.

Lri
fuente
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.

Stéphane Chazelas
fuente
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
Francis W
fuente
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