如何计算文件中的每个字母?
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.Counter
是 dict
的子类,并且这些不保持旧版 python 版本。
以下命令
- 删除所有非 ASCII 字母的字符;
- 每个字符各占一行;
- 对字符进行排序;
- 计算相同连续行的数量。
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
我有一个 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.Counter
是 dict
的子类,并且这些不保持旧版 python 版本。
以下命令
- 删除所有非 ASCII 字母的字符;
- 每个字符各占一行;
- 对字符进行排序;
- 计算相同连续行的数量。
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