Finde die Länge der längsten Zeile in allen Textdateien in einem Verzeichnis

16

Ich kann Länge der längsten Zeile in einer Textdatei mit erhalten awk

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

aber wie kann ich die Länge der längsten Zeile aller Dateien in einem Verzeichnis ermitteln?

trupty
quelle

Antworten:

11

Die einfachste Lösung besteht darin, alle Dateien zu verketten und das Ergebnis an Ihr Skript weiterzuleiten:

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

Sie können auch mehrere Dateien direkt an awk übergeben:

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

Natürlich kann es einige Warnungen geben, wenn Dateien tatsächlich Verzeichnisse sind, aber es sollte harmlos sein. Sie haben möglicherweise größere Probleme mit Binärdateien, da sie kein Linienkonzept haben . Um genauer zu sein, können Sie so etwas tun

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

um nur die .txtDateien im aktuellen Verzeichnis abzugleichen.

Und, wie @ G-Man in seinem Kommentar feststellte, *werden keine versteckten Dateien gefunden (beginnend mit einem Punkt). Wenn Sie diese möchten, verwenden Sie * .*.

lgeorget
quelle
Oder wohl cat * .* | .... Oder beseitigen Sie den nutzlosen Gebrauch der Katze und sagen Sie awk '...' * .*.
G-Man sagt, dass Monica
@ G-Man In der Tat. Ich habe meine Antwort dazu bearbeitet, als Sie einen Kommentar abgegeben haben. :-) Das habe ich sehr einfach gesagt, weil das Verketten der Dateien mit cat anfangs einfacher schien.
Lgeorget
4

Mit GNU wc:

cat *.txt|wc -L

-L druckt die Länge der längsten Zeile.

Lri
quelle
4

Wenn Sie die maximale Länge pro Datei mit GNU awk wollen:

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

Oder die maximale Länge in allen Dateien:

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

Dies setzt voraus, dass die Dateien mit Zeilenumbrüchen enden. Wenn eine Datei nicht mit einem Zeilenumbruch endet, wird die letzte nicht begrenzte Zeile mit der ersten Zeile der nächsten Datei zusammengeführt und das Ergebnis möglicherweise ungültig.

-size +1c ist eine Optimierung, da Textdateien, die leer sind oder nur ein Zeichen enthalten, jeweils 0 Zeilen und 1 Leerzeile haben, also nicht die längste Zeile haben.

Stéphane Chazelas
quelle
Sie sind Textdateien und enden in Zeilenumbrüchen (es sei denn, sie sind leer).
Gilles 'SO- hör auf böse zu sein'
0

Auch mit GNU wc (coreutils 8.4) können mehrere Dateien verarbeitet werden

wc -L *.txt
  • listet die Länge jeder einzelnen Datei auf
  • sowie die längste Länge aller Dateien
Francis W
quelle
Dies ist im Wesentlichen , was dieses andere Antwort Erwähnen wc -Ltut, aber Ihre Lösung hat den Nachteil , dass Sie durch die Maximallänge aller anderen Dateien zuerst waten. Hat das einen Vorteil?
Anthon