2009-09-02 7 views
31

Mam kilka plików tekstowych i chciałbym policzyć ile razy pojawia się w nich każda litera?Jak używać powłoki UNIX do liczenia liczby wyświetleń litery w pliku tekstowym?

W szczególności chciałbym użyć powłoki UNIX, aby to zrobić, w postaci: pliku cat | .... robić rzeczy ...

Czy istnieje sposób, w jaki mogę uzyskać polecenie wc, aby to zrobić?

+0

plik cat | nie ma wyjścia, nie, nawet o tym nie myśl. Przeważnie jest używany z mniejszą lub grep, gdzie kot nie jest potrzebny. Proszę nie używać kota, jeśli nie chcesz po prostu wypisać plik. –

+2

Kot jest rzeczywiście przydatny do utrzymywania minimum pamięci RAM. Przydaje się podczas pracy z dużymi plikami, ponieważ będzie podawany przez linię po linii. – Goran

Odpowiedz

39
grep char -o filename | wc -l 
+7

Uwaga dla osób początkowo zagmatwanych, takich jak ja, zamień "znak" na szukany znak lub ciąg znaków. – rlorenzo

+1

Ponadto, większość implementacji grep ma opcję "-c" do zliczania. –

+0

Powyższe działa również dla łańcuchów, więc 'grep -o | wc -l' to wersja generyczna. Np .: grep, -o myfile.txt | wc -l' zlicza przecinki w myfile.txt i 'grep abcd -o myfile.txt | wc -l' zlicza liczbę 'abcd's w pliku myfile.txt – arun

0

spróbować z

grep [PATTERN] -o [FILE] | wc -l 

i proszę nie używać kota, jeśli nie są potrzebne.

+0

Co jest złego w używaniu kota? – samoz

+1

nie zlicza wielu znaków w linii – SilentGhost

+0

@samoz: cat jest błędny, ponieważ powinien wprowadzić plik do odczytu do innego programu - drugi program może sam odczytać plik, więc użycie kota jest niepotrzebne i komplikuje się kodeline. @SilentGhost: twoje prawo. –

1

Alternatywa dla grep:

sed 's/[^x]//g' filename | tr -d '\012' | wc -c 

gdzie x jest postać chcesz liczyć.

1

Jest też awk:

$ echo -e "hello world\nbye all" | awk -Fl '{c += NF - 1} END {print c}' 
5 

Zmienić -Fl do -F<your character>.

Działa to poprzez ustawienie ogranicznika pola na znak określony przez -F, a następnie zgromadzenie liczby pól w każdym wierszu - 1 (ponieważ jeśli istnieje jeden separator, istnieją dwa pola - ale powinniśmy liczyć tylko 1).

11

Inną alternatywą:

tr -d -C X <infile | wc -c 

gdzie X to znak lub ciąg znaków chcesz liczyć i plik_we jest plik wejściowy.

+2

To jest czystsza niż zaakceptowana odpowiedź (która polega na tym, że wynik polecenia 'grep -o' jest rozdzielany przez znaki nowej linii). Działa to również z DOWOLNYM znakiem (w tym '\ n') – Camusensei

0

Oto kolejny sposób

cat input_file | \ 
awk 'BEGIN {FS="x"; var=0 } \ 
{if (NF>0){ var=var + (NF-1) } } \ 
END{print var}' 

gdzie X to znak lub ciąg znaków chcesz liczyć i plik_we jest plik wejściowy

+0

Ładne' UUOC' tam – Camusensei

1
awk '{ printf "%s\n", gsub("ur_char", "oth_char", $0) }' <your_file_name> output.txt 

można dodać liczbę bieżącym numerem linii do pobierz numery linii również w awk.

1

echo "a/b/c/d/e/f/g" | awk -F "/" '{print NF}'

to daje liczbę wystąpienia znaku "/"

+0

To nie działa z wejściem wieloliniowym – Camusensei

1

W tym przypadku, I'am licząc znaku "|":

expr `wc -c < filename` \- `tr -d \| < filename | wc -c` 
1

Możesz łatwo wypróbować: grep -c 'YOUR LETTER' YOUR FILE

+0

numer pojawi się na powłoce, w znaku nowej linii –

Powiązane problemy