Как посчитать, сколько раз конкретный символ появляется в файле?

18

Например, мы хотим сосчитать все "символы quote ( ); мы просто беспокоимся, если в файлах больше кавычек, чем должно быть.

Например:

cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"

Ожидаемые результаты:

16

Яэль
источник
См. Самый простой способ найти пропущенную цитату в bash-скрипте? если это то, что вы действительно хотите знать.
G-Man говорит: «Восстановите Монику»

Ответы:

25

Вы можете комбинировать tr(переводить или удалять символы) с wc(считать слова, строки, символы):

tr -cd '"' < yourfile.cfg | wc -c

( -dУкажите все символы в поле « cПропустить» ", а затем подсчитайте количество cхарактеров.)

Ульрих Шварц
источник
20

подход grep :

grep -o '"' file | wc -l
16 
  • -o - выводить только совпадающие подстроки

Или с одним глазком :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - пустой разделитель записей (вместо новой строки)

  • FPAT='"' - шаблон, определяющий значение поля

RomanPerekhrest
источник
-oявляется нестандартным расширением GNU для стандартной grepутилиты. Это не упоминается в документации POSIX дляgrep .
Эндрю Хенле
4

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

Этот awkскрипт сообщает о любой строке во входной строке, которая содержит нечетное количество кавычек:

awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }'

Мы задаем разделитель полей ( FS) к "с , -F'"'что означает , что если линия имеет четное число полой она имеет нечетные кавычки. NFколичество полей в последней записи и NRпорядковый номер текущей записи («номер строки»).

Учитывая следующий вход:

$ 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"

мы получаем

$ 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"

Что-то вроде

$ grep -o '"' | wc -l

вернет "14" для этого файла.

Кусалананда
источник
2

Еще один gawkподход:

awk -v RS=\" 'END{print NR-1}'
αғsнιη
источник
2

Чистый BASH:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}
Thunderbeef
источник
Это tmpмассив? Если да, tmpэто массив чего?
Тим
@ Тим нет. tmpв этом фрагменте находится обычная переменная оболочки. И я не одобряю этот ответ, потому что он подсчитывает, сколько раз символ появляется в переменной ( var), а не в файле, как указано в вопросе.
Wildcard
0

пытаться:

grep -0 '"' File -c

однако, это не будет работать, если два или более символа в одной строке. Они будут считаться одним символом

Абдулкарим Малкади
источник
1
Добро пожаловать на U & L! Похоже, это на самом деле не отвечает на вопрос, так как он будет считать строки вместо символов. Написание эффективных ответов настоятельно рекомендуется для U & L - см. Ответы в справочном центре. Возможно, вы захотите улучшить это.
Фра-сан
0

grep -oF '"' file | wc -l

-F обозначает фиксированную строку

shinek
источник
Это то же самое, что и первая часть ответа RomanPerekhrest, за исключением того, что вы добавили -Fфлаг, который здесь не нужен.
G-Man говорит: «Восстановите Монику»
0

Эксцентричный двойной метод GNU grep :

grep -o \" file | grep -c .
АРУ
источник