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



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.


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

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    

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

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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.