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

Set*_*-xx 17 command-line bash text-processing

例如我有 file 1.txt,其中包含:

Moscow
Astana
Tokyo
Ottawa
Run Code Online (Sandbox Code Playgroud)

我想将所有字符的数量计算为:

a - 4,
b - 0,
c - 1,
...
z - 0
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 25

你可以用这个:

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
Run Code Online (Sandbox Code Playgroud)

sed部分在每个字符后放置一个换行符。然后我们sort按字母顺序输出。最后uniq计算出现的次数。该-iuniq可以,如果你不想不区分大小写进行中省略。

  • 这太棒了。一个额外的警告是将输出再次通过管道传送到 `sort -k 2` 以按字母数字顺序列出它们。 (4认同)
  • 这是最短的方式,最容易理解但不幸的是最慢 (3认同)

Jac*_*ijm 6

有点晚了,但要完成设置,另一种 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
Run Code Online (Sandbox Code Playgroud)

解释

  1. 读取文件,跳过空格并作为“字符”返回:

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

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

    print(c+" -", chars.count(c)) for c in <uniques>
    
    Run Code Online (Sandbox Code Playgroud)

如何使用

  1. 将代码粘贴到一个空文件中,另存为 chars_count.py
  2. 通过以下任一方式将文件作为参数运行:

    /path/to/chars_count.py </path/to/file>
    
    Run Code Online (Sandbox Code Playgroud)

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

    python3 /path/to/chars_count.py </path/to/file>
    
    Run Code Online (Sandbox Code Playgroud)

    如果不是


αғs*_*нιη 5

默认情况下,在˚F ield小号eparator(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
Run Code Online (Sandbox Code Playgroud)

{for (i=1;i<=NF;i++) a[$i]++} ... FS="" ...块中,我们只是拆分字符。而
END{for (c in a) print c,a[c]}块,我们循环数组a和它打印保存字符print c及其出现次数a[c]