Як підрахувати, скільки разів у файлі з'являється певний символ?


18

Наприклад, ми хочемо порахувати всі цитати ( ") символів; ми просто хвилюємось, якщо у файлах більше цитат, ніж слід.

Наприклад:

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


Відповіді:


26

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

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

( -dДаліть все символи в complement з ", а потім підрахувати cСимволи.)


20

греп підхід:

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

Чистий БАШ:

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

Це tmpмасив? Якщо так, tmpце масив того, що?
Тім

@Tim, ні. 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.