Muszę policzyć liczbę wystąpień znaku w ciągu znaków za pomocą funkcji Bash.
W poniższym przykładzie, gdy char to (na przykład) t
, echo
jest to poprawna liczba wystąpień t
in var
, ale gdy znak jest przecinkiem lub średnikiem, wypisuje zero:
var = "text,text,text,text"
num = `expr match $var [,]`
echo "$num"
Odpowiedzi:
Użyłbym następującego
awk
polecenia:Dzielę ciąg według
$char
i wypisuję liczbę wynikowych pól minus 1.Jeśli twoja powłoka nie obsługuje
<<<
operatora, użyjecho
:źródło
$(grep -o "$needle" < filename | wc -l)
wc -l
, po prostu użyjgrep -c
, działa zarówno na bsd grep, jak i linux grep.grep -c
wyświetli tylko liczbę pasujących wierszy. Nie liczy wielu dopasowań w jednej linii.możesz na przykład usunąć wszystkie inne znaki i policzyć, co zostało, na przykład:
wydrukuje
lub
lub
lub
lub
lub
źródło
y="${x//[^s|S]}"; echo "${#y}"
wc
? To golf!echo -n some line | wc -l
tr -dc ',' <<<"$var" | wc -c
Możesz to zrobić, łącząc
tr
iwc
polecenia. Na przykład, aby liczyće
w ciągureferee
wynik
Objaśnienia: Polecenie
tr -cd 'e'
usuwa wszystkie znaki inne niż „e”, a Poleceniewc -c
liczy pozostałe znaki.Wiele wierszy danych wejściowych jest również dobrych dla tego rozwiązania, tak jak polecenie
cat mytext.txt | tr -cd 'e' | wc -c
może liczyće
w plikumytext.txt
, nawet jeśli plik może zawierać wiele wierszy.źródło
Opierając się na świetnych odpowiedziach i komentarzach wszystkich, oto najkrótsza i najsłodsza wersja:
grep -o "$needle" <<< "$haystack" | wc -l
źródło
awk działa dobrze, jeśli masz go na serwerze
źródło
awk -F,
szuka pliku,
. Możesz wykonać następujące czynności:awk -F"${your_char}"
Sugerowałbym, co następuje:
Żadnego wywołania innego programu
źródło
też to sprawdź, na przykład chcemy liczyć
t
lub w
python
lub nawet lepiej, możemy uczynić nasz skrypt dynamicznym za pomocą
awk
w tym przypadku wynik wygląda tak:
źródło