如何计算每个字符出现的次数?

如何计算每个字符出现的次数?

例如我有一个文件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

解释

  1. 读取文件,跳过空格并以“字符”形式返回:

    chars = open(sys.argv[1]).read().strip().replace("\n", "")
    
  2. 创建一组(已排序)唯一值:

    sorted(set([c for c in chars]))
    
  3. 计算并打印每个字符的出现次数:

    print(c+" -", chars.count(c)) for c in <uniques>
    

如何使用

  1. 将代码粘贴到空文件中,另存为chars_count.py
  2. 使用文件作为参数来运行它,方法如下:

    /path/to/chars_count.py </path/to/file>
    

    如果脚本是可执行的,或者:

    python3 /path/to/chars_count.py </path/to/file>
    

    如果不是

答案3

默认情况下F领域年代分离器(FS)是空间或者标签因为我们想要计算每个字符的数量,所以我们必须将 FS 重新定义为 nothing( FS=""),以便将每个字符拆分为单独的行并将其保存到数组中,然后在块的末尾END{..},通过以下方式打印它们的总出现次数命令:

$ 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 操作打印该数组。

相关内容