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
计算出现的次数。该-i
旗uniq
可以,如果你不想不区分大小写进行中省略。
有点晚了,但要完成设置,另一种 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)
读取文件,跳过空格并作为“字符”返回:
chars = open(sys.argv[1]).read().strip().replace("\n", "")
Run Code Online (Sandbox Code Playgroud)创建一组(排序的)唯一值:
sorted(set([c for c in chars]))
Run Code Online (Sandbox Code Playgroud)计算并打印每个字符的出现次数:
print(c+" -", chars.count(c)) for c in <uniques>
Run Code Online (Sandbox Code Playgroud)chars_count.py
通过以下任一方式将文件作为参数运行:
/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)
如果不是
默认情况下,在AWK的˚F ield小号eparator(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
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]