Підрахунок подій символу у простому текстовому файлі


132

Чи є під Linux / термінал спосіб підрахувати, скільки разів знак char f виникає у простому текстовому файлі?


9
Технічно це можна вважати ш / баш / тощо. питання програмування, тому я думаю, що він має силу в будь-якому місці.
Роб Грушка

@Rob Hruska: так, я також думаю, що це баш програмування ... @abrashka: відповідь на ваше перше і друге питання - "НІ"!
cupakob

Відповіді:


178

Як щодо цього:

fgrep -o f <file> | wc -l

Примітка: Крім того, що запам'ятовувати / дублювати та налаштовувати набагато простіше, це приблизно втричі (вибачте, редагуйте! Пройшов перший тест) швидше, ніж відповідь Вереба.


Цей не працює, якщо вам потрібно рахувати \rчи \nсимволів; tr -cd fвідповідь робить роботу для цього.
bjnord

3
Розраховувати кілька символів, наприклад a, bі cвикористовуйте egrep: egrep -o 'a|b|c' <file> | wc -l.
Skippy le Grand Gourou

Крім того, остерігайтеся НЕ використовувати wc -cяк у trвідповіді: оскільки grepвиводи рядка за рядком, wcкінцеві рядки будуть зараховані як символи (отже, подвоєння кількості символів).
Skippy le Grand Gourou

@bjnord Добре \r, але порахувати, \nчому б не просто використовувати wc -l?
Skippy le Grand Gourou

67

ще швидше:

tr -cd f < file | wc -c

Час виконання цієї команди з файлом з 4,9 Мб і 1100000 випадків пошуку символу:

real   0m0.089s
user   0m0.057s
sys    0m0.027s

Час для відповіді Vereb з echo, cat, trі bcдля того ж файлу:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

Час для Rob Hruška відповіді з tr, sedі wcдля того ж файлу:

real   0m0.465s
user   0m0.411s
sys    0m0.080s

Час для відповіді Jefromi з fgrepі wcдля того ж файлу:

real   0m0.522s
user   0m0.477s
sys    0m0.023s 

3
Розраховувати кілька символів, наприклад a, bі c: tr -cd abc < file | wc -l.
Skippy le Grand Gourou

ти впевнений? не припустимо бути tr -cd abc < file | wc -cзамість цього
Мітхун Б

10
echo $(cat <file>  | wc -c) - $(cat <file>  | tr -d 'A' | wc -c) | bc

де А - символ

Час виконання цієї команди з файлом з 4,9 Мб і 1100000 випадків пошуку символу:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

1
Це стає приблизно на третину швидше, якщо ви виймете зайві cats, надавши ім'я файлу як аргумент wcта і tr.
Каскабель

1
Якщо ви дійсно хочете оптимізувати це, він читає файл лише один раз: echo $ (stat -c% s <file>) - $ (cat <file> | tr -d 'A' | wc -c) | bc
Вереб

@Vereb - tr читає лише stdin, але це може бути записано , а не cated:tr -d 'A' < <file> | wc ...
dsz

7

Якщо все, що вам потрібно зробити, - це підрахувати кількість рядків, що містять вашого персонажа, це спрацює:

grep -c 'f' myfile

Однак він підраховує кілька випадків 'f' в одному рядку, як і одна відповідність.


4

tr -d '\n' < file | sed 's/A/A\n/g' | wc -l

Заміна двох входжень "A" вашим персонажем, а "file" вашим вхідним файлом.

  • tr -d '\n' < file: видаляє нові рядки
  • sed 's/A/A\n/g: додає новий рядок після кожного появи "A"
  • wc -l: підраховує кількість рядків

Приклад:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.