我有一个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
报告唯一行及其计数。它需要排序输入,因为它只比较当前行和前一行。
以下命令
- 删除非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
您可以这样使用python的collections.Counter
,让cord.txt
的内容为
188H,190D,245H
187D,481E,482T
187H,194E,196D
386D,388E,389N,579H
44E,60D
andcounting.py
be
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
的子类,这些在旧版本中不保持顺序。
简写:
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