Bagaimana cara menghitung berapa kali karakter tertentu muncul dalam file?


18

Misalnya, kami ingin menghitung semua "karakter kutipan ( ); kami hanya khawatir jika file memiliki lebih banyak kutipan dari yang seharusnya.

Sebagai contoh:

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

hasil yang diharapkan:

16


Jawaban:


25

Anda dapat menggabungkan tr(menerjemahkan atau menghapus karakter) dengan wc(hitung kata, garis, karakter):

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

( -dhapus semua karakter dalam complement of ", dan kemudian hitung karakter c.)


20

pendekatan grep :

grep -o '"' file | wc -l
16 
  • -o - Output hanya cocok dengan substring

Atau dengan melongo :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - pemisah rekaman kosong (bukan baris baru)

  • FPAT='"' - pola mendefinisikan nilai bidang


-oadalah ekstensi GNU non-standar ke greputilitas standar . Itu tidak disebutkan dalam dokumentasi POSIX untukgrep .
Andrew Henle

4

Jika dua baris dalam file memiliki jumlah tanda kutip ganda ganjil, jumlah total tanda kutip ganda akan genap, dan Anda tidak akan mendeteksi tanda kutip tidak seimbang (ini yang saya anggap ingin Anda lakukan, tapi saya mungkin salah ).

awkSkrip ini melaporkan setiap baris di baris input yang memiliki jumlah penawaran ganjil:

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

Kami mengatur pemisah lapangan ( FS) untuk "dengan -F'"'yang berarti bahwa jika garis memiliki jumlah yang lebih dari bidang memiliki tanda kutip aneh. NFadalah jumlah bidang dalam catatan terkini, dan NRmerupakan nomor urut dari catatan saat ini ("nomor baris").

Diberikan input berikut:

$ 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"

kita mendapatkan

$ 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"

Sesuatu seperti

$ grep -o '"' | wc -l

akan mengembalikan "14" untuk file ini.



2

BASH murni:

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

Apakah tmparray? Jika ya, tmpapakah array dari apa?
Tim

@Tim, tidak. tmpdalam cuplikan ini adalah variabel shell normal. Dan saya downvoting jawaban ini karena ini menghitung berapa kali karakter muncul dalam variabel ( var) daripada dalam file seperti yang ditentukan dalam pertanyaan.
Wildcard

0

mencoba:

grep -0 '"' File -c

Namun, ini tidak akan berfungsi jika dua atau lebih char di baris yang sama. Mereka akan dihitung sebagai satu char


1
Selamat datang di U&L! Ini sepertinya tidak benar-benar menjawab pertanyaan, karena itu akan menghitung baris, bukan karakter. Menulis jawaban yang efektif sangat dianjurkan di U&L - lihat Menjawab di pusat bantuan. Anda mungkin ingin meningkatkan yang ini.
fra-san


0

Metode GNU ganda eksentrik grep:

grep -o \" file | grep -c .
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.