2012-09-26 16 views
6

Im Linux-Befehl mit wc -L ist es möglich, die Länge der längsten Zeile einer Textdatei zu erhalten.Länge der kürzesten Linie?

Wie finde ich die Länge der kürzesten Zeile einer Textdatei?

+0

http://superuser.com/q/135753/109661 – hovanessyan

Antwort

11

Versuchen Sie folgendes:

awk '{print length}' <your_file> | sort -n | head -n1 

Dieser Befehl ruft Längen aller Dateien, sortiert sie (richtig, als Zahlen) und fianlly, druckt die kleinste Zahl zu trösten.

10

Reine awk Lösung:

awk '(NR==1||length<shortest){shortest=length} END {print shortest}' file 
+0

Dies scheint etwas schneller. – ADTC

0

Ich drehte den awk-Befehl in einer Funktion (für bash):

function shortest() { awk '(NR==1||length<shortest){shortest=length} END {print shortest}' $1 ;} ## report the length of the shortest line in a file

hinzugefügt dies meine .bashrc (und dann „Quelle Bashrc ")

und dann lief es: kürzeste "yourFileNameHere"

[~]$ shortest .history 
2

Es kann einer Variablen zugewiesen werden (man beachte die backtics erforderlich sind):

[~]$ var1=`shortest .history` 
[~]$ echo $var1 
2 

Für csh:

alias shortest "awk '(NR==1||length<shortest){shortest=length} END {print shortest}' \!:1 "

0

Beide awk Lösungen von oben nicht umgehen '\ r' so wie es tut. Für eine einzeilige Eingabedatei sollten sie keine Werte erzeugen, die größer sind als die maximale Leitungslänge, die von wc -L gemeldet wird.

Dies ist eine neue sed basierte Lösung (ich war während abzukürzen nicht in der Lage richtig zu halten):

echo $((`sed 'y/\r/\n/' file|sed 's/./#/g'|sort|head -1|wc --bytes`-1)) 

Hier einige Beispiele sind, zeigt ‚\ r‘ Anspruch und demonstriert sed Lösung:

$ echo -ne "\rABC\r\n" > file 
$ wc -L file 
3 file 
$ awk '{print length}' file|sort -n|head -n1 
5 
$ awk '(NR==1||length<shortest){shortest=length} END {print shortest}' file 
5 
$ echo $((`sed 'y/\r/\n/' file|sed 's/./#/g'|sort|head -1|wc --bytes`-1)) 
0 
$ 
$ echo -ne "\r\r\n" > file 
$ wc -L file 
0 file 
$ echo $((`sed 'y/\r/\n/' file|sed 's/./#/g'|sort|head -1|wc --bytes`-1)) 
0 
$ 
$ echo -ne "ABC\nD\nEF\n" > file 
$ echo $((`sed 'y/\r/\n/' file|sed 's/./#/g'|sort|head -1|wc --bytes`-1)) 
1 
$ 
Verwandte Themen