Ich suche nach einer einfachen Möglichkeit, die Länge der längsten Zeile in einer Datei zu ermitteln. Im Idealfall handelt es sich um einen einfachen Bash-Shell-Befehl anstelle eines Skripts.
197
Verwenden von wc (GNU coreutils) 7.4:
wc -L filename
gibt:
101 filename
-c -l -m -w
Optionen POSIX sind.-L
ist ein GNUismus.-L
vom Gebietsschema abhängt. Einige Zeichen (sowohl im Byte- als auch im Multibyte-Sinne) werden möglicherweise überhaupt nicht gezählt!wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
ist in dercoreutils
Formel enthalten, die alle GNU-Coreutils mit einemg
Präfix installiert .Als Referenz: Suchen der längsten Zeile in einer Datei
quelle
END{}
Block.quelle
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
awk 'length>max{max=length}END{print max}' file
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
Nur zu Spaß- und Lernzwecken die reine POSIX-Shell-Lösung , ohne unnötigen Einsatz von Katze und ohne Verzicht auf externe Befehle. Nimmt den Dateinamen als erstes Argument:
quelle
< "$1"
kann es leicht von stdin lesen. Mit einem Test$#
könnte es sogar beides tun, abhängig von der Anzahl der Argumente. Es gibt einfach keine Notwendigkeit für nutzlose Katzen auf dieser Welt. Neulinge sollten von Anfang an entsprechend unterrichtet werden.longest < /usr/share/dict/words
gibt
quelle
wc
Ausgabe des Dateinamens zu verhindern :)Druckt die Länge, Zeilennummer und den Inhalt der längsten Zeile
Druckt eine sortierte Liste aller Zeilen mit Zeilennummern und -längen
.
ist der Verkettungsoperator - er wird hier verwendet, nachdem length ()$.
die aktuelle Zeilennummer$_
die aktuelle Zeile istquelle
wc -L
ist die beste Lösung, die ich bisher gesehen habe.wc -L
3 Sekunden dauertewc -L
Zählen Sie einfach die Anzahl der Datensätze - dieses Q wollte gerade die längste Zeile finden - nicht ganz gleich, daher ist dies kein genauer Vergleich.Wichtiger übersehener Punkt in den obigen Beispielen.
Die folgenden 2 Beispiele zählen erweiterte Registerkarten
Die folgenden 2 zählen nicht erweiterte Registerkarten.
so
quelle
Anscheinend gibt die Antwort nicht die Zeilennummer der längsten Zeile an. Der folgende Befehl kann die Zeilennummer und die ungefähre Länge angeben:
quelle
awk '{print length}' test.txt | sort -rn | head -1
. Wenn Sie auch den eigentlichen Inhalt der Zeile benötigen, dannawk '{print length,$0}' test.txt | sort -k1 -rn| head -1
In Perl:
Dadurch wird nur die Linie gedruckt, nicht auch ihre Länge.
quelle
Hier sind Referenzen der Antwort
http://wtanaka.com/node/7719
quelle
Nur zum Spaß, hier ist die Powershell-Version:
Und um nur die Länge zu bekommen:
quelle
sort
filename.txt als Argument verwendet werden? Dann ist die Katze nutzlos, weil siesort length filename.txt | select -last 1
eine Pipe und einen Prozess vermeidet, bei dem nur Daten kopiert werden.Ich bin in einer Unix-Umgebung und arbeite mit komprimierten Dateien, die einige GB groß sind. Ich habe die folgenden Befehle mit einer 2-GB-komprimierten Datei mit einer Datensatzlänge von 2052 getestet.
zcat <gzipped file> | wc -L
und
zcat <gzipped file> | awk '{print length}' | sort -u
Die Zeiten waren durchschnittlich
117 Sekunden
109 Sekunden
Hier ist mein Skript nach ca. 10 Läufen.
quelle
awk
Version vom Zwischenspeichern der Festplattenblöcke der Version profitiertwc
, die zuerst ausgeführt wird (und den Festplatten-Cache setzt). Sie müssten die Reihenfolge, wer in den zehn Läufen zuerst angerufen wird, nach dem Zufallsprinzip sortieren, damit dieses Argument erhalten bleibt.Variation des Themas.
In diesem werden alle Zeilen mit der Länge der längsten in der Datei gefundenen Zeile angezeigt, wobei die Reihenfolge beibehalten wird, in der sie in der Quelle angezeigt werden.
Also meine Datei
wird geben
quelle
Wenn Sie MacOS verwenden und diesen Fehler erhalten:
wc: illegal option -- L
Sie müssen GNU nicht einfach installieren.Wenn Sie nur die Anzahl der Zeichen in der längsten Zeile der Datei abrufen möchten und OS X ausführen:
awk '{print length}' "$file_name" | sort -rn | head -1
Etwas wie das;
echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"
Ausgänge:
The longest line in the file my_file has 117 characters
quelle