大括号扩展和grep可以在linux中一起使用吗

大括号扩展和grep可以在linux中一起使用吗,linux,grep,curly-braces,Linux,Grep,Curly Braces,我试图计算每个ASCII可打印字符在文件中出现的次数。我认为这样做的一个好方法可能是在{}封闭列表中列出可打印字符,并在大括号内的每个项目上使用grep。下面是一个示例代码。我想扩展字符列表以包括所有64个ASCII可打印字符。我不知道如何让代码分别读取和使用大括号之间的每个字符。我确实希望以character\tcharacterCount格式输出文件。有什么建议吗 char={" ",!,\",#,"\$"} cat PHRED_scores.txt | grep -e "$char" |

我试图计算每个ASCII可打印字符在文件中出现的次数。我认为这样做的一个好方法可能是在{}封闭列表中列出可打印字符,并在大括号内的每个项目上使用grep。下面是一个示例代码。我想扩展字符列表以包括所有64个ASCII可打印字符。我不知道如何让代码分别读取和使用大括号之间的每个字符。我确实希望以character\tcharacterCount格式输出文件。有什么建议吗

char={" ",!,\",#,"\$"}
cat PHRED_scores.txt | grep -e "$char" | wc -m 

下面的命令将显示文件中的特殊字符及其总数

grep -oP '[ !\\$#]' file | sort | uniq -c
说明:

o-仅打印匹配项。 带有Perl regexp选项的P-grep。 [!\\&]-字符类中包含特殊字符。您必须转义\以便它表示文字\ 排序输出将被排序。 uniq-c所有的副本都被计数,然后将其合并为一个。
有一种方法可以避免单独列出所有64个字符以匹配ASCII字符集。Bash提供了字符类,并允许范围表示大量字符,而无需列出每个字符。例如:

[a-z]       match all lowercase characters
[A-Z]       match all uppercase characters
[0-9]       match all digits
[[:print:]] all printable characters
因此,只需很少的努力,您就可以将所有大小写字符和所有数字与以下内容匹配:

[a-zA-Z0-9]
然后可以添加额外的可打印字符,但必须注意转义或避免对正则表达式本身具有特殊意义的字符。一个并非包罗万象的例子是

[a-zA-Z0-0:;~!@#$%&*()_-+=]
也可以使用预定义的类:

[:print:]
您可以根据需要添加。为了解决您的问题,正如Avinash提供的sort | uniq-c可以提供单个计数。向wc-m添加一个额外的调用将提供总数。有了它,就不难开发一个脚本,该脚本将文件名作为参数,并给出所需的总字符数和单个字符数。类似于以下内容的操作将起作用:

#!/bin/bash

echo -n "Total character count:  "
grep $cclass "$1" | wc -m              # obtain the total character count

echo -e " Individual frequency:"
grep -o [[:print:]] "$1" | sort | uniq -c  # obtain the individual frequency

exit 0
样本输出:

Total character count:  455
 Individual frequency:
  6 =
 10 _
  7 -
  4 ,
 12 ;
  1 /
  4 .
  6 "
  9 (
  9 )
  2 {
  2 }
  2 *
  5 \
  2 #
  4 %
  4 0
  3 a
 17 b
 11 c
  1 C
 24 d
  4 D
 28 e
  1 E
 ...