如何对文件中的每个字母进行计数?

  • 本文关键字:文件 linux bash shell sh
  • 更新时间 :
  • 英文 :


我有一个cord.txt文件,如下所示,

188H,190D,245H
187D,481E,482T
187H,194E,196D
386D,388E,389N,579H
44E,60D

我需要计算每个字母,并且必须做一个总结,如下所示(预期输出),

H,4
D,5
E,4
T,1

我知道如何通过使用grep "<letter>" cord.txt | wc来计数每个字母。但是我有一个包含更多字母的大文件,所以请帮我做同样的事情。

提前感谢。

你错过了N:-)

grep -o '[[:alpha:]]' cord.txt | sort | uniq -c
  • grep -o只输出匹配部分。对于POSIX类[[:alpha:]],它输出输入中包含的所有字母。
  • sort将相同的字母组合在一起
  • uniq -c报告唯一行及其计数。它需要排序输入,因为它只比较当前行和前一行。

以下命令

  1. 删除非ASCII字母的字符;
  2. 将每个字符放在单独的行上;
  3. 对字符排序;
  4. 连续行数
sed 's/[^a-zA-Z]//g' < input.txt | fold -w 1 -s | sort | uniq -c > output.txt
# ^                                ^              ^      ^
# 1.                               2.             3.     4.

输入:

188H,190D,245H
187D,481E,482T
187H,194E,196D
386D,388E,389N,579H
44E,60D

输出:

5 D
4 E
4 H
1 N
1 T

您可以这样使用python的collections.Counter,让cord.txt的内容为

188H,190D,245H
187D,481E,482T
187H,194E,196D
386D,388E,389N,579H
44E,60D

andcounting.pybe

import collections
counter = collections.Counter()
with open("cord.txt", "r") as f:
for line in f:
counter.update(i for i in line if i.isalpha())
for char, cnt in counter.items():
print("{},{}".format(char,cnt))

然后python counting.py输出

H,4
D,5
E,4
T,1
N,1

注意,我使用for line in f,其中f是文件句柄,以避免将整个文件加载到内存中。免责声明:我使用的是python版本3.7,旧版本应该可以工作,但可能会在输出中给出其他顺序,因为collections.Counterdict的子类,这些在旧版本中不保持顺序。

简写:

tr '[0-9],' \n <input | sort | uniq -c
43 
5 D
4 E
4 H
1 N
1 T

好的,还有43个字符…您可以通过添加sed:

来删除和匹配您的请求。
tr '[0-9],' \n </tmp/so/input | sort | uniq -c |
sed -ne 's/^ *([0-9]+) (.)/2,1/p'
D,5
E,4
H,4
N,1
T,1

相关内容

  • 没有找到相关文章

最新更新