Jestem pewien, że jest na to wiele sposobów: jak policzyć liczbę linii w pliku tekstowym?
$ <cmd> file.txt
1020 lines
command-line
Chris Smith
źródło
źródło
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
./regexp/d
usuwa linię, jeśli pasujeregexp
, i-e
włącza odpowiednią składnię (IMNSHO) dlaregexp
.grep -v '^+ *%' matlab.git.diff | wc -l
?grep
polecenie, aby traktować je jako przypadki komentarza, takie jak" + Hello"
(zwróć uwagę na spacje przed+
)?grep -v '^ *+' matlab.git.diff | wc -l
(Zakładam, że znaki cudzysłowu nie miały być częścią wiersza; zakładam również, że obie linie ze spacjami i bez przed nimi+
mają być komentarzami; jeśli w najmniej jedno pole jest obowiązkowe, albo zastąpić gwiazdę*
z\+
, lub po prostu dodać kolejne miejsca przed gwiazdą). Prawdopodobnie zamiast dopasowywać tylko spacje, chciałbyś dopasować dowolne białe znaki; w tym celu zastąp spację znakiem[[:space:]]
. Zauważ, że usunąłem również dopasowanie,%
ponieważ nie ma go w twoim przykładzie.Jak powiedział Michael,
wc -l
jest to najlepsza droga. Ale tylko w przypadku, gdy w niewytłumaczalny sposób miećbash
,perl
czyawk
jednak niewc
, oto jeszcze kilka rozwiązań:Tylko bash
Rozwiązania Perla
i znacznie mniej czytelny:
Awk Solution
źródło
Steven D zapomniał o GNU
sed
:Ponadto, jeśli chcesz zliczać bez wypisywania nazwy pliku i używasz
wc
:Tylko do cholery:
źródło
grep -c ''
, lubtr -dc '\n' | wc -c
, lubnl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... Czy którykolwiek z nich jest przydatny sam w sobie (w przeciwieństwie do rzeczy, na których można budować program, który robi więcej niż zliczanie linii), innych niżwc -l
czysty (ba) sh?sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
i możeszcut -c -7
zachować tylko numer. Albo, bardziej POSIXly:uniq -c file.txt | awk '{c+=$1}END{print c}'
. Co powiesz na todc
(chociaż nie jest to POSIX)?uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
.bc
jest POSIX:uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
. Prosta odpowiedź, jeśli przyjąć ograniczoną długość linii:uniq -c -f 100000 file.txt
.Słowo ostrzeżenia podczas korzystania
ponieważ wc -l działa poprzez zliczanie \ n, jeśli ostatni wiersz w pliku nie kończy się skutecznie nową linią, licznik linii zostanie wyłączony o 1. (stąd stara konwencja pozostawiająca nową linię na końcu pliku)
Ponieważ nigdy nie mogę mieć pewności, czy dany plik jest zgodny z konwencją kończenia ostatniego wiersza znakiem nowej linii, czy nie, zalecam użycie któregokolwiek z tych alternatywnych poleceń, które będą zawierać ostatni wiersz w liczeniu, niezależnie od znaku nowego wiersza, czy nie.
źródło
Jeśli masz tylko bash i absolutnie żadne zewnętrzne narzędzia nie są dostępne, możesz również wykonać następujące czynności:
Objaśnienie: pętla odczytuje standardową linię wejściową linia po linii (
read
; ponieważ i tak nic nie robimy z danymi wejściowymi do odczytu, nie podano żadnej zmiennej do ich zapisania) i zacount
każdym razem zwiększa zmienną . Z powodu przekierowania (<file.txt
podone
) standardowe wejście dla pętli pochodzi zfile.txt
.źródło
Zawsze możesz użyć polecenia
grep
w następujący sposób:Policzy wszystkie wiersze
file.txt
, niezależnie od tego, czy ostatni wiersz zawiera znak LF na końcu.źródło