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.
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.
Antworten:
Verwenden von wc (GNU coreutils) 7.4:
wc -L filename
gibt:
101 filename
-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 der coreutils
Formel enthalten, die alle GNU-Coreutils mit einem g
Präfix installiert .
awk '{print length, $0}' Input_file |sort -nr|head -1
Als Referenz: Suchen der längsten Zeile in einer Datei
END{}
Block.
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
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:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
< "$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
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Druckt die Länge, Zeilennummer und den Inhalt der längsten Zeile
perl -ne 'print length()." line $. $_"' myfile | sort -n
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 ist
wc -L
ist die beste Lösung, die ich bisher gesehen habe.
wc -L
3 Sekunden dauerte
wc -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
wc -L <"${SourceFile}"
# or
expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Die folgenden 2 zählen nicht erweiterte Registerkarten.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
so
Expanded nonexpanded
$'nn\tnn' 10 5
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:
$ cat -n test.txt | awk '{print "longest_line_number: " $1 " length_with_line_number: " length}' | sort -k4 -nr | head -3
longest_line_number: 3 length_with_line_number: 13
longest_line_number: 4 length_with_line_number: 12
longest_line_number: 2 length_with_line_number: 11
awk '{print length}' test.txt | sort -rn | head -1
. Wenn Sie auch den eigentlichen Inhalt der Zeile benötigen, dann awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Hier sind Referenzen der Antwort
cat filename | awk '{print length, $0}'|sort -nr|head -1
Nur zum Spaß, hier ist die Powershell-Version:
cat filename.txt | sort length | select -last 1
Und um nur die Länge zu bekommen:
(cat filename.txt | sort length | select -last 1).Length
sort
filename.txt als Argument verwendet werden? Dann ist die Katze nutzlos, weil sie sort 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.
START=$(date +%s) ## time of start
zcat $1 | wc -L
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
START=$(date +%s) ## time of start
zcat $1 | awk '{print length}' | sort -u
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
awk
Version vom Zwischenspeichern der Festplattenblöcke der Version profitiert wc
, 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.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Also meine Datei
x
mn
xyz
123
abc
wird geben
xyz
123
abc
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
-c -l -m -w
Optionen POSIX sind.-L
ist ein GNUismus.