Ich bin sicher, es gibt viele Möglichkeiten, dies zu tun: Wie kann ich die Anzahl der Zeilen in einer Textdatei zählen?
$ <cmd> file.txt
1020 lines
command-line
Chris Smith
quelle
quelle
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
./regexp/d
löscht eine übereinstimmende Zeileregexp
und-e
aktiviert eine angemessene (IMNSHO) Syntax fürregexp
.grep -v '^+ *%' matlab.git.diff | wc -l
?grep
Befehl zu ändern, um ihn als Kommentar zu betrachten, z. B." + Hello"
(Leerzeichen vor dem+
)?grep -v '^ *+' matlab.git.diff | wc -l
(Ich gehe davon aus, dass die Anführungszeichen eigentlich nicht Teil der Zeile waren; ich gehe auch davon aus, dass beide Zeilen mit und ohne Leerzeichen vor dem+
Kommentar sein sollen; wenn um Mindestens ein Leerzeichen ist obligatorisch (entweder ersetzen Sie den Stern*
durch\+
oder fügen Sie einfach ein weiteres Leerzeichen vor dem Stern hinzu). Wahrscheinlich möchten Sie statt nur Leerzeichen beliebige Leerzeichen verwenden. Ersetzen Sie dazu das Leerzeichen durch[[:space:]]
. Beachten Sie, dass ich auch das Matching entfernt habe,%
da es nicht in Ihrem Beispiel ist.Wie Michael sagte,
wc -l
ist der Weg zu gehen. Aber nur für den Fall , dass Sie aus unerklärlichen Gründenbash
,perl
oderawk
aber nichtwc
, hier sind ein paar Lösungen:Nur Bash
Perl-Lösungen
und die weit weniger lesbar:
Awk-Lösung
quelle
Steven D hat GNU vergessen
sed
:Wenn Sie die Anzahl ohne Ausgabe des Dateinamens ermitteln möchten und Folgendes verwenden
wc
:Nur zum Teufel:
quelle
grep -c ''
, odertr -dc '\n' | wc -c
, odernl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... Ist irgendetwas von diesen an sich nützlich (im Gegensatz zu Dingen, auf denen man aufbauen muss, um ein Programm zu erstellen, das mehr als das Zählen von Zeilen leistet) alswc -l
und reines (ba) sh?sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
und du kannstcut -c -7
nur die nummer behalten. Oder mehr POSIXly:uniq -c file.txt | awk '{c+=$1}END{print c}'
. Wie wäre esdc
(obwohl es nicht POSIX ist)?uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
.bc
POSIX ist:uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
. Die einfache Antwort , wenn Sie davon ausgehen , eine begrenzte Leitungslänge:uniq -c -f 100000 file.txt
.Wort der Warnung bei der Verwendung
Weil wc -l durch Zählen von \ n funktioniert. Wenn die letzte Zeile in Ihrer Datei nicht effektiv in einer neuen Zeile endet, ist die Zeilenzahl um 1 niedriger. (Daher belässt die alte Konvention die neue Zeile am Ende Ihrer Datei.)
Da ich nie sicher sein kann, ob eine bestimmte Datei der Konvention folgt, die letzte Zeile mit einer neuen Zeile zu beenden, empfehle ich, einen dieser alternativen Befehle zu verwenden, der die letzte Zeile in die Zählung einbezieht, unabhängig davon, ob eine neue Zeile eingegeben wurde oder nicht.
quelle
Falls Sie nur bash und absolut keine externen Tools zur Verfügung haben, können Sie auch Folgendes tun:
Erläuterung: Die Schleife liest die Standardeingabe zeilenweise (
read
da wir mit der Leseeingabe sowieso nichts anfangen, wird keine Variable zum Speichern bereitgestellt) und erhöht die Variablecount
jedes Mal. Aufgrund der Umleitung (<file.txt
nachdone
) ist die Standardeingabe für die Schleife vonfile.txt
.quelle
Sie können den Befehl jederzeit
grep
wie folgt verwenden:Es werden alle tatsächlichen Zeilen gezählt
file.txt
, unabhängig davon , ob die letzte Zeile am Ende ein LF-Zeichen enthält oder nicht.quelle