2009-10-21 38 views
111

Có cách nào dưới linux/terminal để đếm, số lần char f xảy ra trong một tệp văn bản thuần túy không?Số lần xuất hiện của một char trong tập tin văn bản thuần túy

+4

thuộc về superuser – Malfist

+8

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

+0

@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 là "KHÔNG"! – cupakob

Trả lời

159

Làm thế nào về thi s:

fgrep -o f <file> | wc -l 

Lưu ý: Bên cạnh đó dễ nhớ hơn/sao chép và tùy chỉnh, đây là khoảng ba lần (xin lỗi, chỉnh sửa! làm hỏng thử nghiệm đầu tiên) nhanh hơn câu trả lời của Vereb.

+0

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

+1

Để đếm một số ký tự, ví dụ: 'a',' b' và 'c', sử dụng' egrep': 'egrep -o 'a | b | c' | wc -l'. –

+0

Ngoài ra, hãy cẩn thận để KHÔNG sử dụng 'wc -c' như trong câu trả lời' tr': vì dòng đầu ra 'grep' theo dòng,' wc' sẽ tính các dòng cuối cùng làm ký tự (do đó nhân đôi số ký tự). –

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

nơi A là nhân vật

Thời gian cho lệnh này với một tập tin với 4,9 MB và 1100000 lần xuất hiện của nhân vật đã tìm kiếm:

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

Điều này sẽ nhanh hơn một phần ba nếu bạn lấy ra 'cat' s không cần thiết, đặt tên tập tin làm đối số cho' wc' và 'tr'. – Cascabel

+0

tiếc là tr chỉ hoạt động trên đầu vào tiêu chuẩn – Vereb

+1

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

3

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

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

  • tr -d '\n' < file: loại bỏ dòng mới
  • sed 's/A/A\n/g: thêm một dòng mới sau mỗi lần xảy ra "A"
  • wc -l: đếm số dòng

Ví dụ:

$ cat file 
abcdefgabcdefgababababbbba 


1234gabca 

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l 
9 
6

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

grep -c 'f' myfile 

Tuy nhiên, nó sẽ tính nhiều lần xuất hiện của 'f' trên dòng giống như một trận đấu duy nhất.

56

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 tin với 4,9 MB và 1100000 lần xuất hiện của nhân vật đã tìm kiếm:

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

Thời Vereb câu trả lời với echo, cat, trbc cho cùng một tệp:

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

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

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

Thời Jefromi câu trả lời với fgrepwc cho cùng một file:

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

Để đếm một số ký tự, ví dụ: 'a',' b' và 'c':' tr -cd abc

+0

Bạn đã lưu tôi tìm cú pháp đúng cho 'tr'! – Pysis

Các vấn đề liên quan