如何计算文件中的每个字母?

How to count each letters from a file?

我有一个 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 class [[:alpha:]],它输出输入中包含的所有字母。
  • sort 将相同的字母组合在一起
  • uniq -c 报告唯一行及其计数。它需要排序输入,因为它只比较当前行和前一行。

您可以使用python的collections.Counter如下,令cord.txt内容为

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

counting.py

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 的子类,并且这些不保持旧版 python 版本。

以下命令

  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

很快:

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]\+\) \(.\)/,/p'
D,5
E,4
H,4
N,1
T,1