2013-05-21 9 views
62

Мне нужно посчитать число вхождений символа в строке, используя Bash. .Количество вхождений символа в строке с использованием Bash

В следующем примере, когда полукокс (например) t, это echo с правильным числом вхождений t в var, но когда символ запятая или точка с запятой, она выводит ноль:

var = "text,text,text,text" 
num = `expr match $var [,]` 
echo "$num" 
+0

http: //unix.stackexchange.com/questions/18736/how-to-count-the-number-of-a-specific-character-in-each-line –

ответ

66

Я хотел бы использовать следующую команду: awk

string="text,text,text,text" 
char="," 
awk -F"${char}" '{print NF-1}' <<< "${string}" 

Я разделив строку по $char и напечатать число результирующих полей минус 1.

Если ваша оболочка не поддерживает оператор <<<, используйте echo:

echo "${string}" | awk -F"${char}" '{print NF-1}' 
+0

Что делать, если var - это файл с текстом. как можно изменить это выше? – HattrickNZ

+0

@HattrickNZ Затем используйте: '$ (grep -o" $ needle " hek2mgl

+0

@ hek2mgi. но этот выдает 3?! когда я эхо «number_of_occurences» – Amir

68

можно, например, удалить все другие символы и посчитать, Что остается, как :

var="text,text,text,text" 
res="${var//[^,]}" 
echo "$res" 
echo "${#res}" 

напечатает

,,, 
3 

или

tr -dc ',' <<<"$var" | awk '{ print length; }' 

или

tr -dc ',' <<<"$var" | wc -c #works, but i don't like wc.. ;) 

или

awk -F, '{print NF-1}' <<<"$var" 

или

grep -o ',' <<<"$var" | grep -c . 

или

perl -nle 'print s/,//g' <<<"$var" 
+1

[еще несколько трюков здесь] (http://www.cyberciti.biz/faq/unix-linux-appleosx-bsd-bash-count-characters-variables/), как 'y =" $ {x // [^ s | S]} "; echo "$ {# y}" ' –

+4

использовать первый, всегда следует избегать использования другого процесса для выполнения подобной работы, он может серьезно повлиять на производительность при использовании с большими циклами итерации. Как правило, внешнее выполнение процесса должно быть последним средством при использовании повторяющихся или повторяющихся операций. – osirisgothra

+0

Почему вам не нравится 'wc'? Это гольф! –

1

AWK работает хорошо, если вы сервер имеет его

var="text,text,text,text" 
num=$(echo "${var}" | awk -F, '{print NF-1}') 
echo "${num}" 
15

Вы можете сделать это путем объединения tr и wc команды. Например, для подсчета e в строке referee

echo "referee" | tr -cd 'e' | wc -c 

выходного

4 

Пояснение: Команда tr -cd 'e' удаляет все, кроме «х» символов и команд wc -c подсчитывает оставшиеся символы.

Несколько линий ввода также хороши для этого решения, как команда рассчитывает ecat mytext.txt | tr -cd 'e' | wc -c можно в файле mytext.txt, даже думал, что файл может содержать много строк.

+0

Ваше решение кажется самым чистым и легким для запоминания, спасибо! – jirislav

Смежные вопросы