如何计算特定字符在文件中出现的次数?

yae*_*ael 28 text-processing

例如,我们要统计所有的引号 ( ") 字符;我们只是担心文件是否有比它应该更多的引号。

例如:

cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"
Run Code Online (Sandbox Code Playgroud)

预期成绩:

16

Ulr*_*arz 46

您可以将tr(翻译或删除字符)与wc(计算单词、行、字符)结合起来:

tr -cd '"' < yourfile.cfg | wc -c
Run Code Online (Sandbox Code Playgroud)

-d删除 的c补全中的所有字符",然后计算字符数c。)


Rom*_*est 33

grep方法:

grep -o '"' file | wc -l
16 
Run Code Online (Sandbox Code Playgroud)
  • -o - 只输出匹配的子串

或者用单目瞪口呆

awk -v RS='' -v FPAT='"' '{print NF}' file
16
Run Code Online (Sandbox Code Playgroud)
  • RS='' - 空记录分隔符(而不是换行符)

  • FPAT='"' - 定义字段值的模式


Kus*_*nda 6

如果文件中的两行有奇数个双引号,则双引号的总和将为偶数,并且您将不会检测到不平衡的引号(这是我认为您实际上想要做的,但我可能是错的)。

awk脚本报告输入行中具有奇数个引号的任何行:

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

我们将字段分隔符 ( FS) 设置为"with -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"
Run Code Online (Sandbox Code Playgroud)

我们得到

$ 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"
Run Code Online (Sandbox Code Playgroud)

就像是

$ grep -o '"' | wc -l
Run Code Online (Sandbox Code Playgroud)

将为该文件返回“14”。