Wie zähle ich Textzeilen?

14

Wie zähle ich, wie viele Zeilen sich in einer Textdatei befinden? z.B :

command file.txt

Hinweis: Ich möchte nur die nicht leeren Zeilen zählen (Zeilen ohne Leerzeichen und Tabulatoren).

user93097373
quelle
4
Die Frage ist nicht klar definiert: Wird eine Zeile mit nur Leerzeichen (Leerzeichen und TAB) als leer betrachtet?
Rmano
Enge Wähler : Frage bearbeitet nach @ Rmanos Klarstellung gemäß seinem Kommentar von OP. Bitte stimmen Sie nicht ab, um als unklar zu schließen.
αғsнιη
2
@ Kasiya es ist immer noch unklar. Ich verstehe nicht, ob das OP eine Zeile nur mit Leerzeichen (Leerzeichen, Tabulatoren \r) zählen oder überspringen möchte . Der Strom beantwortet alle Zählzeilen mit Leerzeichen und überspringt nur leere.
Terdon
@terdon OP Möchte NICHT die Leerzeilen zählen (einschließlich Leerzeilen ( \roder \n), Zeilen mit Tabulatoren und Zeilen mit Leerzeichen) und möchte sie überspringen, wie ich denke und laut beantwortet Was ich verstanden habe.
αғsнιη

Antworten:

11

Die obige Antwort ist korrekt, aber etwas anders, Sie können den grepCode für einfachere wie zgrep -vc '^$' file.txt

Zum Beispiel (A): file.txt

$grep -vc '^$' file.txt

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$2

Zum Beispiel (B): file.txt

$sed '/^$/d' file.txt | wc -l

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$4

Beachten Sie, dass das Ergebnis 4 ist! wenn wir nur zwei erwarten wollen. Dies zählt aber auch die Tabulatoren zwischen Inhalt und Kommentar.

Beachten Sie, dass die Zählungen von 0 und von 1 von grep bis sed unterschiedlich sind, da ich mich erinnere, dass ich für weitere Details nach grep oder sed suche.

amrx
quelle
1
In beiden Beispielen werden die Leerzeilen gezählt, aber OP hat einen Befehl angefordert, um alles zu zählen, ABER die Leerzeilen
kos
2
Eigentlich irre ich mich, die sedOption ist tatsächlich richtig, aber die grepist nicht
kos
Da ich die Antwort nur teilweise richtig geschrieben habe, schreibe mir einen Kommentar, wenn du sie korrigiert hast, damit ich meine Ablehnung entfernen kann
kos
1
@kos Ich bin mir ziemlich sicher, merkst du wie vage die Frage ist?
Amrx
2
@kos, Du hattest in erster Linie recht, Danke. Ich habe über 36 Stunden nicht geschlafen, ich denke, es ist Zeit fürs Bett!
Amrx
12

Versuchen Sie sed:

sed '/^$/d' file.txt | wc -l

Wenn Sie Zeilen haben, die nur Leerzeichen oder Tabulatoren enthalten, und diese beim Zählen ebenfalls ignorieren möchten:

sed '/^[[:blank:]]*$/d' file.txt | wc -l
heemayl
quelle
3
Ich würde ^\s*$auch Zeilen berücksichtigen, die nur Tabulatoren oder Leerzeichen enthalten.
Sylvain Pineau
@ SylvainPineau: Hinzugefügt ..
heemayl
1
Ich stimme zu, dass es aus der Frage von OP nicht klar war, aber Text mit Leerzeichen / Tab kann das erwartete Ergebnis ändern, +1.
Sylvain Pineau
3

Verwenden von grep:

grep -vc '^$' file  # or
grep -vc '^\s*$' file    
muru
quelle
3

Sie können verwenden:

grep -cve '^\s*$' file.txt

Wenn Sie dazu einen Befehl benötigen, fügen Sie einfach die folgenden Zeilen in Ihre ein .bashrcund starten Sie Ihre Shell-Sitzung neu oder öffnen Sie ein neues Terminal:

count_lines()
{
    grep -cve '^\s*$' $1
}

Beispiel:

count_lines file.txt
42
Sylvain Pineau
quelle
2

Mit :

awk 'NF{++count} END{print count}' file

Erläuterung:

Das NFgibt die Gesamtzahl der Felder an und gibt daher nur nicht leere Zeilen aus , da in nicht leeren Zeilen NFgrößer ist als 0und als wahr ausgewertet wird. So erhöhen Sie die Zählung Flag , wenn awk eine Nicht-Leerzeilen gefunden und druckt den neuesten Wert von Zählung Flagge am Ende durch END{print count}.

αғsнιη
quelle
1

Bearbeiten : Sie können einfach die cOption hinzufügen , um eine kompaktere Version zu erhalten, grepanstatt alles an wc@ murus Antwort weiterzuleiten


Mit grep:

grep -v '^$' file.txt | wc -l
kos
quelle
0

Perl-Lösung

Perl kann das. Im Allgemeinen funktioniert das Zählen von Zeilen folgendermaßen:

$ perl -ne 'END{print $.}' input.txt                                                                                     

Wenn wir alle Leerzeilen ausschließen wollen, machen wir so etwas:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             

Nehmen wir an, wir haben eine Eingabedatei wie diese

$ cat -n input.txt
     1  Cat; Dog; Squirrel
     2  ORGANISM Animalus terrus
     3  
     4  Sequence: ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
     5  

Insgesamt gibt es 5 Zeilen, 2 Leerzeilen. Der Befehl, den wir haben, würde ausgeben:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             
3

Verbesserung mehrerer Dateien

Dies funktioniert gut für eine einzelne Datei. Wenn wir möchten, dass es mit mehreren Dateien funktioniert, können wir Folgendes tun:

$ perl -ne '$c+=1 if not /^$|^\s+$/;printf("%d %s\n",$c,$ARGV) and $c=0 if eof' input.txt /etc/passwd                    
3 input.txt
52 /etc/passwd
Sergiy Kolodyazhnyy
quelle