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


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


Ответы:


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='"' - шаблон, определяющий значение поля


-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

Чистый BASH:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}

Это tmpмассив? Если да, tmpэто массив чего?
Тим

@ Тим нет. tmpв этом фрагменте находится обычная переменная оболочки. И я не одобряю этот ответ, потому что он подсчитывает, сколько раз символ появляется в переменной ( var), а не в файле, как указано в вопросе.
Wildcard

0

пытаться:

grep -0 '"' File -c

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


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


0

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

grep -o \" file | grep -c .
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.