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


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


Answers:



20

grep方法:

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

或与单个gawk

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

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


-o是标准grep实用程序的非标准GNU扩展。的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在此代码段中是一个普通的shell变量。我不赞成这个答案,因为它计算的是字符出现在变量var)中的次数,而不是问题中指定的文件中出现的次数。
通配符

0

尝试:

grep -0 '"' File -c

但是,如果同一行中有两个或多个字符,则此操作将无效。它们将被计为一个字符


1
欢迎来到U&L!这似乎并没有真正回答问题,因为它将计数行而不是字符。强烈建议您在U&L上撰写有效的答案-请参阅帮助中心中的“ 回答 ”。您可能需要改进这一点。
fra-san


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.