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

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

例如,我们要统计所有引号 ( ") 字符;我们只是担心文件中的引号是否多于应有的数量。

例如:

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

答案1

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

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

-dc删除的补足中的所有字符",然后统计c字符(字节)。某些版本wc可能支持-mor--chars标志,这将更适合非 ASCII 字符计数。

答案2

grep方法:

grep -o '"' file | wc -l
16 
  • -o- 只输出匹配的子串

或与单呆呆地

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

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

答案3

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

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

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

我们将字段分隔符 ( 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"

我们得到

$ 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”。

答案4

另一种单一awk方法:

awk '{ count+=gsub(/"/, "") } END{ print count+0 }'

相关内容