可以支持扩展和grep在linux中一起使用

时间:2014-07-03 04:28:14

标签: linux grep curly-braces

我正在尝试计算文件中每个ASCII可打印字符的次数。我认为这样做的一个好方法可能是在{}包含列表中列出可打印字符,并在大括号内的每个项目上使用grep。下面是一个示例代码。我想扩展char列表以包括所有64个ASCII可打印字符。我无法弄清楚如何让代码分别阅读和使用大括号之间的每个字符。我真的想以“character \ tcharacterCount”格式输出一个文件。有什么建议吗?

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

2 个答案:

答案 0 :(得分:0)

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

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

<强>解释

  • o - 仅打印匹配。
  • P - grep with Perl-regexp option。
  • [ !\\&#] - 字符类中包含特殊字符。您必须转义\,以便它意味着文字\
  • sort输出将被排序。
  • uniq -c计算所有重复项,然后将其合并为一个。

答案 1 :(得分:0)

有一种方法可以避免单独列出所有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
 ...