Đếm số lần xuất hiện của một char trong tệp văn bản thuần


132

Có cách nào trong linux / terminal để đếm không, bao nhiêu lần char f xảy ra trong một tệp văn bản thuần túy?


9
Về mặt kỹ thuật, điều này có thể được coi là một sh ​​/ bash / vv. câu hỏi lập trình, vì vậy tôi nghĩ rằng nó có giá trị ở cả hai nơi.
Rob Hruska

@Rob Hruska: vâng, tôi cũng nghĩ là lập trình bash ... @abrashka: câu trả lời cho câu hỏi đầu tiên và thứ hai của bạn là "KHÔNG"!
cupakob

Câu trả lời:


178

Còn cái này thì sao:

fgrep -o f <file> | wc -l

Lưu ý: Bên cạnh việc dễ nhớ / sao chép và tùy chỉnh dễ dàng hơn nhiều, điều này gấp khoảng ba lần (xin lỗi, chỉnh sửa! Đã thực hiện bài kiểm tra đầu tiên) nhanh hơn câu trả lời của Vereb.


Cái này không hoạt động nếu bạn cần đếm \rhoặc \nký tự; các tr -cd fcâu trả lời làm việc cho điều đó.
bjnord

3
Để đếm một số ký tự, ví dụ a, bc, sử dụng egrep: egrep -o 'a|b|c' <file> | wc -l.
Skippy le Grand Gourou

Ngoài ra, hãy cẩn thận KHÔNG sử dụng wc -cnhư trong trcâu trả lời: vì grepđầu ra từng dòng, wcsẽ tính cuối dòng là ký tự (do đó nhân đôi số ký tự).
Skippy le Grand Gourou

@bjnord Ok cho \r, nhưng để đếm \ntại sao không chỉ sử dụng wc -l?
Skippy le Grand Gourou

67

thậm chí nhanh hơn:

tr -cd f < file | wc -c

Thời gian cho lệnh này với một tệp có 4,9 MB và 1100000 lần xuất hiện của ký tự được tìm kiếm:

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

Thời gian cho Vereb câu trả lời với echo, cat, trbccho cùng một tập tin:

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

Thời gian cho Rob Hruska câu trả lời với tr, sedwccho cùng một tập tin:

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

Thời gian để Jefromi trả lời với fgrepwccho cùng một tệp:

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

3
Để đếm một số ký tự, ví dụ a, bc: tr -cd abc < file | wc -l.
Skippy le Grand Gourou

bạn có chắc không? không phải là giả sử tr -cd abc < file | wc -cthay thế
Mithun B

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

trong đó A là nhân vật

Thời gian cho lệnh này với một tệp có 4,9 MB và 1100000 lần xuất hiện của ký tự được tìm kiếm:

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

1
Điều này sẽ nhanh hơn khoảng một phần ba nếu bạn loại bỏ các cats không cần thiết , đặt tên tệp làm đối số cho wctr.
Cascabel

1
Nếu bạn thực sự muốn tối ưu hóa việc này, hãy đọc tệp chỉ một lần: echo $ (stat -c% s <file>) - $ (cat <file> | tr -d 'A' | wc -c) | bc
Vereb

@Vereb - tr chỉ đọc stdin, nhưng điều đó có thể được xử lý chứ không phải cated:tr -d 'A' < <file> | wc ...
dsz

7

Nếu tất cả những gì bạn cần làm là đếm số lượng dòng chứa nhân vật của bạn, điều này sẽ hoạt động:

grep -c 'f' myfile

Tuy nhiên, nó tính nhiều lần xuất hiện của 'f' trên cùng một dòng với một trận đấu.


4

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

Thay thế hai lần xuất hiện của "A" bằng ký tự của bạn và "tệp" bằng tệp đầu vào của bạn.

  • tr -d '\n' < file: xóa dòng mới
  • sed 's/A/A\n/g: thêm một dòng mới sau mỗi lần xuất hiện của "A"
  • wc -l: đếm số dòng

Thí dụ:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.