Làm cách nào để đếm số lần một ký tự cụ thể xuất hiện trong một tệp?


18

Ví dụ: chúng tôi muốn đếm tất cả các "ký tự quote ( ); chúng tôi chỉ lo lắng nếu các tập tin có nhiều trích dẫn hơn nó nên.

Ví dụ:

cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"

kết quả mong đợi:

16


Câu trả lời:


25

Bạn có thể kết hợp tr(dịch hoặc xóa ký tự) với wc(đếm từ, dòng, ký tự):

tr -cd '"' < yourfile.cfg | wc -c

( -dxóa tất cả các ký tự trong phần bổ sung ccủa ", và sau đó đếm các cký tự.)


20

phương pháp grep :

grep -o '"' file | wc -l
16 
  • -o - đầu ra chỉ khớp với các chuỗi con

Hoặc với một con chim ưng duy nhất :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - dấu tách bản ghi trống (thay vì dòng mới)

  • FPAT='"' - mẫu xác định giá trị trường


-olà một phần mở rộng GNU không chuẩn cho greptiện ích tiêu chuẩn . Nó không được đề cập trong tài liệu POSIX chogrep .
Andrew Henle

4

Nếu hai dòng trong tệp có số lượng dấu ngoặc kép lẻ, tổng số dấu ngoặc kép sẽ là số chẵn và bạn sẽ không phát hiện dấu ngoặc kép không cân bằng (đây là điều tôi cho là bạn thực sự muốn làm, nhưng tôi có thể sai ).

awkKịch bản lệnh này báo cáo bất kỳ dòng nào trong dòng đầu vào có số lượng trích dẫn lẻ:

awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }'

Chúng tôi đặt dấu tách trường ( FS) thành "-F'"'nghĩa là nếu một dòng có số trường chẵn thì nó có dấu ngoặc kép. NFlà số trường trong bản ghi gần đây và NRlà số thứ tự của bản ghi hiện tại ("số dòng").

Cho đầu vào sau:

$ cat file
cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,override_uid","true"
cluster-env,recovery_enabled","false"

chúng tôi nhận được

$ awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }' file
Line 3 has odd quoting: cluster-env,override_uid","true"
Line 4 has odd quoting: cluster-env,recovery_enabled","false"

Cái gì đó như

$ grep -o '"' | wc -l

sẽ trả về "14" cho tập tin này.



2

BASH tinh khiết:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}

tmpmột mảng? Nếu có, tmplà một mảng của những gì?
Tim

@Tim, không. tmptrong đoạn trích này là một biến vỏ bình thường. Và tôi hạ thấp câu trả lời này vì số này đếm số lần một ký tự xuất hiện trong một biến ( var) thay vì trong một tệp như được chỉ định trong câu hỏi.
tự đại diện

0

thử:

grep -0 '"' File -c

tuy nhiên, điều này sẽ không hoạt động nếu hai hoặc nhiều char trong cùng một dòng. Họ sẽ được tính là một char


1
Chào mừng bạn đến với U & L! Điều này dường như không thực sự trả lời câu hỏi, vì nó sẽ đếm các dòng thay vì các ký tự. Viết câu trả lời hiệu quả được khuyến khích mạnh mẽ trên U & L - xem phần Trả lời trong trung tâm trợ giúp. Bạn có thể muốn cải thiện điều này.
fra-san


0

Phương pháp GNU đôi lệch tâm grep:

grep -o \" file | grep -c .
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.