encontre o comprimento da linha mais longa em todos os arquivos de texto em um diretório

16

Eu sei como obter o comprimento da linha mais longa em um arquivo de texto com awk

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

mas como posso obter o comprimento da linha mais longa de todos os arquivos em um diretório?

trupty
fonte

Respostas:

11

A solução mais direta é concatenar todos os arquivos e canalizar o resultado para o seu script:

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

Você também pode passar diretamente vários arquivos para o awk:

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

Obviamente, pode haver alguns avisos se os arquivos forem de fato diretórios, mas devem ser inofensivos. Você pode ter problemas maiores com arquivos binários porque eles não têm um conceito de linha . Então, para ser mais específico, você pode fazer algo como

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

para corresponder apenas aos .txtarquivos no diretório atual.

E, como o @ G-Man afirmou em seu comentário, *não corresponderá a arquivos ocultos (começando com um ponto). Se você quiser, use * .*.

lgeorget
fonte
Ou, sem dúvida cat * .* | ...,. Ou elimine o uso inútil do gato e diga awk '...' * .*.
G-Man Diz 'Reinstate Monica
@ G-Man De fato. Eu estava editando minha resposta sobre isso quando você comentou. :-) Eu disse mais direto, porque concatenar os arquivos com o gato é o que parecia mais simples no começo.
precisa saber é o seguinte
4

Com o GNU wc:

cat *.txt|wc -L

-L imprime o comprimento da linha mais longa.

Lri
fonte
4

Se você deseja o tamanho máximo por arquivo, com o GNU awk:

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

Ou o comprimento máximo em todos os arquivos:

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

Isso pressupõe que os arquivos terminem em caracteres de nova linha. Se um arquivo não terminar em um caractere de nova linha, sua última linha não delimitada será mesclada com a primeira linha do próximo arquivo e possivelmente anulará o resultado.

-size +1c é uma otimização, pois os arquivos de texto que estão vazios ou contêm apenas um caractere têm respectivamente 0 linha e 1 linha vazia, portanto, não terão a linha mais longa.

Stéphane Chazelas
fonte
Como são arquivos de texto, terminam com caracteres de nova linha (a menos que estejam vazios).
Gilles 'SO- stop be evil'
0

Também com o GNU wc (coreutils 8.4), ele pode lidar com vários arquivos

wc -L *.txt
  • lista o tamanho de cada arquivo individual
  • além de fornecer o maior comprimento de todos os arquivos
Francis W
fonte
Isso é essencialmente o que essa outra resposta mencionada wc -Lfaz, mas sua solução tem a desvantagem de que você precisa percorrer primeiro o comprimento máximo de todos os outros arquivos. Existe alguma vantagem nisso?
Anthon