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

yael
sumber
Lihat Cara termudah untuk menemukan kutipan yang hilang dalam skrip bash? jika itu yang ingin Anda ketahui.
G-Man Mengatakan 'Reinstate Monica'

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.)

Ulrich Schwarz
sumber
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

RomanPerekhrest
sumber
-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.

Kusalananda
sumber
2

gawkPendekatan tunggal lainnya :

awk -v RS=\" 'END{print NR-1}'
αғsнιη
sumber
2

BASH murni:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}
Petir
sumber
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

Abdulkarim Malkadi
sumber
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

grep -oF '"' file | wc -l

-F adalah singkatan dari fixed string

Shinek
sumber
Ini sama dengan bagian pertama dari jawaban RomanPerekhrest kecuali Anda menambahkan -Fbenderanya, yang tidak diperlukan di sini.
G-Man Mengatakan 'Reinstate Monica'
0

Metode GNU ganda eksentrik grep:

grep -o \" file | grep -c .
agc
sumber