rechercher la longueur de la ligne la plus longue dans tous les fichiers texte d'un répertoire

16

Je sais comment obtenir la longueur de la plus longue ligne d'un fichier texte avec awk

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

mais comment puis-je obtenir la longueur de la plus longue ligne de tous les fichiers d'un répertoire?

trupty
la source

Réponses:

11

La solution la plus simple consiste à concaténer tous les fichiers et à diriger le résultat vers votre script:

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

Vous pouvez également transmettre directement plusieurs fichiers à awk:

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

Bien sûr, il peut y avoir des avertissements si les fichiers sont en fait des répertoires mais cela devrait être inoffensif. Vous pouvez avoir de plus gros problèmes avec les fichiers binaires car ils n'ont pas de concept de ligne . Donc, pour être plus précis, vous pouvez faire quelque chose comme

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

pour correspondre uniquement aux .txtfichiers du répertoire en cours.

Et, comme @ G-Man l'a déclaré dans son commentaire, *ne correspondra pas aux fichiers cachés (en commençant par un point). Si vous les voulez, utilisez * .*.

lgeorget
la source
Ou, sans doute, cat * .* | .... Ou éliminez l' utilisation inutile de chat et dites awk '...' * .*.
G-Man dit `` Réintègre Monica ''
@ G-Man en effet. J'étais en train de modifier ma réponse à ce sujet lorsque vous avez commenté. :-) J'ai dit le plus simple car concaténer les fichiers avec cat est ce qui semblait plus simple au début.
lgeorget
4

Avec GNU wc:

cat *.txt|wc -L

-L imprime la longueur de la ligne la plus longue.

Lri
la source
4

Si vous voulez la longueur maximale par fichier, avec GNU awk:

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

Ou la seule longueur maximale dans tous les fichiers:

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

Cela suppose que les fichiers se terminent par des caractères de nouvelle ligne. Si un fichier ne se termine pas par un caractère de nouvelle ligne, sa dernière ligne non délimitée sera fusionnée avec la première ligne du fichier suivant et annulera éventuellement votre résultat.

-size +1c est une optimisation car les fichiers texte qui sont vides ou contiennent un seul caractère ont respectivement 0 ligne et 1 ligne vide, donc n'auront pas la ligne la plus longue.

Stéphane Chazelas
la source
Ce sont des fichiers texte, donc ils se terminent par des caractères de nouvelle ligne (sauf s'ils sont vides).
Gilles 'SO- arrête d'être méchant'
0

Également avec GNU wc (coreutils 8.4), il peut gérer plusieurs fichiers

wc -L *.txt
  • répertorie la longueur de chaque fichier individuel
  • ainsi que fournir la plus longue longueur de tous les fichiers
Francis W
la source
C'est essentiellement ce que fait cette autre réponse mentionnée wc -L, mais votre solution a l'inconvénient que vous devez d'abord parcourir la longueur maximale de tous les autres fichiers. Y a-t-il un avantage à cela?
Anthon