例如我有一个文件1.txt
,其中包含:
Moscow
Astana
Tokyo
Ottawa
我想计算所有字符的数量:
a - 4,
b - 0,
c - 1,
...
z - 0
答案1
你可以使用这个:
sed 's/./&\n/g' 1.txt | sort | uniq -ic
4
5 a
1 c
1 k
1 M
1 n
5 o
2 s
4 t
2 w
1 y
该sed
部分在每个字符后放置一个换行符。然后我们sort
按字母顺序输出。最后uniq
计算出现的次数。如果您不想区分大小写,可以省略-i
标志。uniq
答案2
有点晚了,但是为了完成设置,另一种 python(3) 方法,排序结果:
#!/usr/bin/env python3
import sys
chars = open(sys.argv[1]).read().strip().replace("\n", "")
[print(c+" -", chars.count(c)) for c in sorted(set([c for c in chars]))]
A - 1
M - 1
O - 1
T - 1
a - 4
c - 1
k - 1
n - 1
o - 4
s - 2
t - 3
w - 2
y - 1
解释
读取文件,跳过空格并以“字符”形式返回:
chars = open(sys.argv[1]).read().strip().replace("\n", "")
创建一组(已排序)唯一值:
sorted(set([c for c in chars]))
计算并打印每个字符的出现次数:
print(c+" -", chars.count(c)) for c in <uniques>
如何使用
- 将代码粘贴到空文件中,另存为
chars_count.py
使用文件作为参数来运行它,方法如下:
/path/to/chars_count.py </path/to/file>
如果脚本是可执行的,或者:
python3 /path/to/chars_count.py </path/to/file>
如果不是
答案3
默认情况下awk这F领域年代分离器(FS)是空间或者标签因为我们想要计算每个字符的数量,所以我们必须将 FS 重新定义为 nothing( FS=""
),以便将每个字符拆分为单独的行并将其保存到数组中,然后在块的末尾END{..}
,通过以下方式打印它们的总出现次数awk命令:
$ awk '{for (i=1;i<=NF;i++) a[$i]++} END{for (c in a) print c,a[c]}' FS="" file
A 1
M 1
O 1
T 1
a 4
c 1
k 1
n 1
o 4
s 2
t 3
w 2
y 1
在{for (i=1;i<=NF;i++) a[$i]++} ... FS="" ...
块中我们只是分割字符。
在END{for (c in a) print c,a[c]}
块中我们循环到数组a
并打印其中保存的字符print c
及其出现的次数a[c]
答案4
这里还有另一个解决方案(在 awk 中)......
awk '
{ for (indx=length($0); indx >= 1; --indx)
++chars[tolower(substr($0, indx, 1))]
}
END { for (c in chars) print c, chars[c]; }
' 1.txt | sort
- 它创建一个关联数组,其中每个字符作为索引值,计数作为数组值。
- END 操作打印该数组。