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
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
Antworten:
Die Standardmethode ist mit wc
, wobei Argumente verwendet werden, um anzugeben, was gezählt werden soll (Bytes, Zeichen, Wörter usw.). -l
ist für Zeilen:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
. /regexp/d
löscht eine übereinstimmende Zeile regexp
und -e
aktiviert eine angemessene (IMNSHO) Syntax für regexp
.
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ünden bash
, perl
oder awk
aber nicht wc
, hier sind ein paar Lösungen:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
und die weit weniger lesbar:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
Steven D hat GNU vergessen sed
:
sed -n '$=' file.txt
Wenn Sie die Anzahl ohne Ausgabe des Dateinamens ermitteln möchten und Folgendes verwenden wc
:
wc -l < file.txt
Nur zum Teufel:
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
, oder tr -dc '\n' | wc -c
, oder nl -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) als wc -l
und reines (ba) sh?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
und du kannst cut -c -7
nur die nummer behalten. Oder mehr POSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'
. Wie wäre es dc
(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
wc -l
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.
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
Falls Sie nur bash und absolut keine externen Tools zur Verfügung haben, können Sie auch Folgendes tun:
count=0
while read
do
((count=$count+1))
done <file.txt
echo $count
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 Variable count
jedes Mal. Aufgrund der Umleitung ( <file.txt
nach done
) ist die Standardeingabe für die Schleife von file.txt
.