Czy w linux / terminalu jest sposób, aby policzyć, ile razy znak f występuje w zwykłym pliku tekstowym?
Czy w linux / terminalu jest sposób, aby policzyć, ile razy znak f występuje w zwykłym pliku tekstowym?
Odpowiedzi:
Co powiesz na to:
fgrep -o f <file> | wc -l
Uwaga: Poza tym, że jest to dużo łatwiejsze do zapamiętania / powielenia i dostosowania, jest to około trzy razy (przepraszam, edycja! Spartaczył pierwszy test) szybciej niż odpowiedź Vereba.
\r
lub \n
znaków; tr -cd f
odpowiedź działa za to.
a
, b
i c
użyć egrep
: egrep -o 'a|b|c' <file> | wc -l
.
wc -c
co w tr
odpowiedzi: ponieważ grep
wyjścia wiersz po wierszu wc
zliczałyby końce wierszy jako znaki (stąd podwojenie liczby znaków).
\r
, ale żeby policzyć, \n
dlaczego nie po prostu użyć wc -l
?
nawet szybciej:
tr -cd f < file | wc -c
Czas na to polecenie z plikiem o wielkości 4,9 MB i 1100000 wystąpień szukanego znaku:
real 0m0.089s
user 0m0.057s
sys 0m0.027s
Czas na Vereb odpowiedzi z echo
, cat
, tr
i bc
dla tego samego pliku:
real 0m0.168s
user 0m0.059s
sys 0m0.115s
Czas na Rob HRUŠKA odpowiedzieć tr
, sed
i wc
dla tego samego pliku:
real 0m0.465s
user 0m0.411s
sys 0m0.080s
Czas na odpowiedź Jefromiego z fgrep
i wc
dla tego samego pliku:
real 0m0.522s
user 0m0.477s
sys 0m0.023s
a
, b
i c
: tr -cd abc < file | wc -l
.
tr -cd abc < file | wc -c
zamiast tego
echo $(cat <file> | wc -c) - $(cat <file> | tr -d 'A' | wc -c) | bc
gdzie A to znak
Czas na to polecenie z plikiem o wielkości 4,9 MB i 1100000 wystąpień szukanego znaku:
real 0m0.168s
user 0m0.059s
sys 0m0.115s
cat
pliki, podając nazwę pliku jako argument do wc
i tr
.
stdin
, ale to może być raczej przesyłane niż cat
ed:tr -d 'A' < <file> | wc ...
Jeśli wszystko, co musisz zrobić, to policzyć liczbę linii zawierających twoją postać, zadziała:
grep -c 'f' myfile
Jednak zlicza wielokrotne wystąpienia „f” w tym samym wierszu jako pojedyncze dopasowanie.
tr -d '\n' < file | sed 's/A/A\n/g' | wc -l
Zastąpienie dwóch wystąpień „A” swoim znakiem i „plikiem” plikiem wejściowym.
tr -d '\n' < file
: usuwa nowe liniesed 's/A/A\n/g
: dodaje nowy wiersz po każdym wystąpieniu „A”wc -l
: liczy liczbę liniiPrzykład:
$ cat file
abcdefgabcdefgababababbbba
1234gabca
$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9