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).



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.


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

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    

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

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}.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.