Intereting Posts
32-разрядная версия с 64-битным и ARM в отношении программ и ОС Как показать только общий размер файла конкретного расширения командой `du` Регулярное выражение Yum или поиск по шаблону? Установка libxcb из источника Постоянная история Баша между отдельными процессами Невозможно установить mysql-server-5.5 / следующие пакеты имеют неудовлетворенные зависимости Беспорядок с файлами разрешений Мне нужна программа для чтения файлов базы геоданных США. Скрипт для Ping IP и создание журнала, показывающего дату / время любого сбоя, раз более 500 мс, а traceroute – отказ Makikng Alt + h переключается на левую панель в tmux Как заставить скрипт bash выполнить определенное действие с ошибками команды _each_? Перемещение последних файлов из одного каталога в другой Что такое «smakynet» в результатах netstat? Разделение большого дерева каталогов по типу файла Добавить статический текстовый слой / бар в терминале

Подсчет последовательных повторений определенного символа (например,)

Скажем, у меня есть файл с строками вроде двух следующих:

foo,bar,,baz,xy foo,,bar,baz,xy,, 

Я хотел бы подсчитать, сколько раз у меня есть (две последовательные запятые, окруженные любым другим персонажем) в каждой строке.

Мой подход до сих пор: я думал, что сначала могу избавиться от всего, кроме любой пары последовательных запятых в каждой строке, а затем заменить эти две запятые на одну запятую, чтобы я мог посчитать их позже. Как я могу это сделать?

Ответ должен быть (если мы заменим двойную запятую одной запятой, выбросившей все остальное):

 , ,, 

или просто:

 1 2 

Perl однострочный для работы:

 perl -nle 'print s/(^|[^,]),,([^,]|$)/$&/g' your_file 

Или, даже короче, с awk :

  awk -F',,' '{print NF-1}' your_file 

В awk можно было бы рассматривать ,, как два вхождения ,,,, в то время как perl не учитывал бы его вообще. Выберите ту, которая подходит для вашего варианта использования.

Обновить

Из вашего комментария кажется, что ваше первоначальное намерение состояло в подсчете количества пустых полей в каждой строке. Если это так, этот однострочный Perl должен помочь (он предполагает, что нет котируемых полей, содержащих запятые):

 perl -nle 'print scalar grep {//} split/,/' your_file 

То же самое в awk если Perl недоступен:

 awk -F, 'empty=0;{for(i=1;i<=NF;i++)if($i=="")empty++};{print empty}' your_file