2012-04-03 2 views
3

Ich habe einige \n beendet Text:max Komma in einer Zeile ist, mit Bash-Skript

Sie geht in Schönheit wie die Nacht
Von wolkenlos Gefilden und Sternenhimmel
Und all das ist am besten, von dunklen und hellen
Treffen in ihrem Aspekt, und ihre Augen

und ich möchte zu finden, welche Zeile hat die maximale Anzahl von , und Druck, die zu zeichnen. Zum Beispiel sollte der Text über das Ergebnis als

Sie geht in Schönheit wie die Nacht

Da hat 2 (max unter allen Linie) Kommas.

Ich habe versucht:

cat p.txt | grep ',' 

aber nicht wissen, wo jetzt gehen.

Antwort

6

könnten Sie awk verwenden:

awk -F, -vmax=0 ' NF > max { max_line = $0; max = NF; } END { print max_line; }' < poem.txt 

Beachten Sie, dass, wenn die max nicht eindeutig ist dies die erste mit der maximalen Zählung nimmt.

+0

+1 aber es ist nicht unbedingt notwendig zu deklarieren vmax: awk behandelt eine undefinierte Variable als Null oder leere Zeichenfolge, abhängig vom Kontext. –

+0

@glennjackman cool, danke für den Tipp :). – FatalError

+0

Vielen Dank und allen anderen! –

3

diese

Awk arbeitet mit 'Fields'

awk '-F,' '{if (NF > maxFlds) {maxFlds=NF; maxRec=$0}} ; END {print maxRec}' poem 

Ausgabe

She walks, in beauty, like the night 
versuchen, sagt die -F Verwendung '' die Felder zu trennen. (Der Standardwert für F ist neben Leerzeichen, Leerzeichen und Tabulatoren)

NF bedeutet Anzahl der Felder (im aktuellen Datensatz). Also verwenden wir Logik, um den Datensatz mit der maximalen Anzahl von Feldern zu finden, den Wert der Zeile "$ 0" zu erfassen, und am Ende drucken wir die Zeile mit den meisten Feldern aus.

Es ist nicht definiert, was passiert, wenn zwei Zeilen die gleiche maximale Anzahl der Kommas haben ;-)

Ich hoffe, das hilft.

0

FatalError FS-basierte Lösung ist nett. Eine andere Art, wie ich denken kann, ist nicht-Komma Zeichen aus der Leitung zu entfernen, dann seine Länge zählen:

[[email protected] ~]$ awk '{t=$0; gsub(/[^,]/,""); print length($0), t;}' poem 
2 She walks, in beauty, like the night 
1 Of cloudless climes, and starry skies 
1 And all that's best, of dark and bright 
1 Meet in her aspect, and her eyes 
[[email protected] ~]$ 

Jetzt müssen wir nur halten Spur davon:

[[email protected] ~]$ awk '{t=$0;gsub(/[^,]/,"");} length($0)>max{max=length($0);line=t} END{print line;}' poem 
She walks, in beauty, like the night 
[[email protected] ~]$ 
0

Reines Bash:

Verwandte Themen