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