Erhalten Länge der längsten Zeile in einer Datei
Frage
Ich bin auf der Suche nach einem einfachen Weg, um die Länge der längsten Zeile in einer Datei zu finden. Idealerweise wäre es eine einfache Bash-Shell-Befehl anstelle eines Skripts sein.
Lösung
Mit wc (GNU coreutils) 7.4:
wc -L filename
gibt:
101 filename
Andere Tipps
awk '{print length, $0}' Input_file |sort -nr|head -1
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
Nur so zum Spaß und pädagogischen Zweck, die reine POSIX-Shell-Lösung , ohne unnötige Verwendung von Katzen- und ohne Forking auf externe Befehle. Nimmt 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"
wc -L < filename
gibt
101
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Gibt die Länge, die Zeilennummer und den Inhalt der längsten Zeile
perl -ne 'print length()." line $. $_"' myfile | sort -n
Druckt eine sortierte Liste aller Linien, mit Zeilennummern und Längen
.
ist der Verkettungsoperator - hier nach Länge () verwendet wird
$.
ist die aktuelle Zeilennummer
$_
ist die aktuelle Zeile
Wichtige übersehen Punkt in den obigen Beispielen.
Die folgenden 2 Beispiele tabs Zählung erweitert
wc -L <"${SourceFile}"
# or
expand --tabs=1 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Die folgenden 2 Zählung nicht Registerkarten expaned.
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
Sieht alle die Antwort nicht die Zeilennummer der längsten Zeile geben. Befehl kann sich die Zeilennummer geben und etwa Länge:
$ 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
In Perl:
perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1
Diese druckt nur die Linie, nicht seine Länge zu.
Hier sind Referenzen der anwser
cat filename | awk '{print length, $0}'|sort -nr|head -1
Just for fun, hier ist die Powershell-Version:
cat filename.txt | sort length | select -last 1
Und nur die Länge zu erhalten:
(cat filename.txt | sort length | select -last 1).Length
Ich bin in einer Unix-Umgebung, und die Arbeit mit gzip-Dateien, die ein paar GBs groß sind. Getestet habe ich die folgenden Befehle ein 2 GB gzip-Datei mit Satzlänge von 2052 verwendet wird.
-
zcat <gzipped file> | wc -L
und
-
zcat <gzipped file> | awk '{print length}' | sort -u
Die Zeiten auf avarage waren
-
117 Sekunden
-
109 Sekunden
Hier ist mein Skript nach etwa 10 Runs.
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"
Variation über das Thema.
Dieser wird zeigen alle Linien, die die Länge der längsten Zeile in der Datei gefunden, die unter Beibehaltung der Reihenfolge, wie sie in der Quelle erscheinen.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
So Meinedat
x
mn
xyz
123
abc
geben
xyz
123
abc