Jak liczyć wiersze tekstu?

14

Jak policzyć, ile wierszy jest w pliku tekstowym. np .:

command file.txt

Uwaga: chcę liczyć tylko niepuste linie (linie bez liczenia białych znaków i tabulatorów) ?.

użytkownik93097373
źródło
4
Pytanie nie jest dobrze zdefiniowane: czy wiersz zawierający tylko białe znaki (spacje i tabulator) jest uważany za pusty?
Rmano,
Bliscy wyborcy : Pytanie zredagowane po wyjaśnieniu @ Rmano zgodnie z jego komentarzem OP. Więc proszę, nie głosuj, aby zamknąć jako
Unclear
2
@KasiyA to wciąż niejasne. Nie rozumiem, czy OP chce liczyć sa tylko z białymi spacjami (spacje, tabulatory \r), czy je pomijać. Bieżące odpowiedzi obejmują wszystkie wiersze ze spacjami i pomijają tylko puste.
terdon
@terdon OP NIE chcę zliczać pustych linii (w tym pustych linii ( \rlub \n), linii z tylko tabulatorami i linii z tylko spacjami) i chcę je pomijać tak, jak myślę i odpowiadam zgodnie z Co ja zrozumiałem.
αғsнιη

Odpowiedzi:

11

Powyższe odpowiedzi są poprawne, ale nieco inne, możesz użyć grepdo dla łatwiejszego kodu takiegogrep -vc '^$' file.txt

Na przykład (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

Na przykład (B): plik.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

Zauważ, że wynik to 4! kiedy chcemy spodziewać się tylko dwóch. ale to także uwzględnia zakładki między treścią a komentarzem.

Zwróć uwagę na zliczanie od 0 i od 1 różni się od grep do sed, ponieważ pamiętam, że po więcej szczegółów szukaj grep lub sed.

amrx
źródło
1
Oba twoje przykłady będą liczyć puste linie, ale OP poprosił o polecenie liczenia wszystkiego, ALE puste linie
koszmar
2
Właściwie się mylę, sedopcja jest właściwie poprawna, ale grepta nie jest
koszmar
Będąc tylko częściowo poprawnym, głosowałem za odpowiedzią, napisz do mnie komentarz, kiedy go naprawisz, abym mógł usunąć głos negatywny
Kos
1
@ Kos Jestem całkiem pewien, zauważasz, jak niejasne jest pytanie?
amrx
2
@kos, Miałeś rację w pierwszej kolejności, dziękuję. Nie spałem od ponad 36 godzin, chyba czas na łóżko!
amrx
12

Spróbuj sed:

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

Jeśli masz jakieś wiersze zawierające tylko spacje lub tabulatory i jeśli chcesz je również zignorować z licznika:

sed '/^[[:blank:]]*$/d' file.txt | wc -l
heemayl
źródło
3
Chciałbym ^\s*$również wziąć pod uwagę wiersze zawierające tylko tabulatory lub spacje.
Sylvain Pineau
@SainainPineau: Dodano ..
heemayl
1
Zgadzam się, że nie było jasne z pytania OP, ale tekst ze spacjami / tabulatorami może zmienić oczekiwany wynik +1.
Sylvain Pineau,
3

Używanie grep:

grep -vc '^$' file  # or
grep -vc '^\s*$' file    
muru
źródło
3

Możesz użyć:

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

Jeśli potrzebujesz do tego polecenia, po prostu wklej następujące wiersze do swojego .bashrci zrestartuj sesję powłoki lub otwórz nowy terminal:

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

Przykład:

count_lines file.txt
42
Sylvain Pineau
źródło
2

Z :

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

Wyjaśnienie:

NFOznacza całkowitą liczbę pól, i stąd ten drukuje tylko nie puste wiersze , ponieważ w nie pustych wierszy NFjest większa 0, a wartość true. Więc zwiększ flagę count, gdy awk znalazł niepuste linie i wypisz ostatnią wartość flagi count na końcu o END{print count}.

αғsнιη
źródło
1

Edycja : możesz po prostu dodać copcję grepzamiast wcprzesyłać wszystko do , zobacz odpowiedź @ muru na bardziej kompaktową wersję


Z grep:

grep -v '^$' file.txt | wc -l
kos
źródło
0

Rozwiązanie Perla

Perl może to zrobić. Ogólnie rzecz biorąc linie liczące działają w następujący sposób:

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

Jeśli chcemy wykluczyć wszystkie puste linie, zrobimy coś takiego:

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

Powiedzmy, że mamy taki plik wejściowy

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

Łącznie jest 5 linii, 2 puste linie. Polecenie, które mamy, wypisze:

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

Ulepszenie wielu plików

Działa to dobrze dla pojedynczego pliku. Jeśli chcemy, aby działał na wielu plikach, możemy zrobić coś takiego:

$ 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
źródło