Saya perlu menghitung jumlah kemunculan karakter dalam string menggunakan Bash.
Pada contoh berikut, ketika char adalah (misalnya) t
, itu echo
s jumlah yang benar dari kejadian t
di var
, tetapi ketika karakter adalah koma atau titik koma, ia akan mencetak nol:
var = "text,text,text,text"
num = `expr match $var [,]`
echo "$num"
Jawaban:
Saya akan menggunakan
awk
perintah berikut :Saya memisahkan string
$char
dan mencetak jumlah bidang yang dihasilkan dikurangi 1.Jika shell Anda tidak mendukung
<<<
operator, gunakanecho
:sumber
$(grep -o "$needle" < filename | wc -l)
wc -l
, cukup gunakangrep -c
, ini berfungsi pada bsd grep dan linux grep.grep -c
hanya akan menampilkan jumlah baris yang cocok. Itu tidak menghitung beberapa kecocokan per baris.Anda dapat misalnya menghapus semua karakter lain dan menghitung yang tersisa, seperti:
akan mencetak
atau
atau
atau
atau
atau
sumber
y="${x//[^s|S]}"; echo "${#y}"
wc
? Ini golf!echo -n some line | wc -l
tr -dc ',' <<<"$var" | wc -c
Anda dapat melakukannya dengan menggabungkan
tr
danwc
perintah. Misalnya, menghitunge
dalam stringreferee
keluaran
Penjelasan: Perintah
tr -cd 'e'
menghapus semua karakter selain 'e', dan Commandwc -c
menghitung karakter yang tersisa.Beberapa baris masukan juga bagus untuk solusi ini, seperti perintah
cat mytext.txt | tr -cd 'e' | wc -c
dapat dihitunge
dalam filemytext.txt
, meskipun file tersebut mungkin berisi banyak baris.sumber
Membangun jawaban dan komentar hebat dari semua orang, ini adalah versi terpendek dan termanis:
grep -o "$needle" <<< "$haystack" | wc -l
sumber
awk bekerja dengan baik jika server Anda memilikinya
sumber
awk -F,
mencari file,
. Anda dapat melakukan hal berikut:awk -F"${your_char}"
Saya akan menyarankan yang berikut:
Tidak ada panggilan ke program lain
sumber
lihat juga ini, misalnya kami ingin menghitung
t
atau dalam
python
atau bahkan lebih baik, kita dapat membuat script kita menjadi dinamis dengan
awk
dalam hal ini keluarannya seperti ini:
sumber