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.

War es hilfreich?

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

Referenz: Suche nach der längsten Zeile in einer Datei

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

http://wtanaka.com/node/7719

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.

  1. zcat <gzipped file> | wc -L

und

  1. zcat <gzipped file> | awk '{print length}' | sort -u

Die Zeiten auf avarage waren

  1. 117 Sekunden

  2. 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top