首页 > 解决方案 > 计算模式在文本文件中出现的次数

问题描述

我有一个这样的文本文件:

  2 29 31 36 44 50 54  
  15 16 19 25 50 54 29  
  9 11 14 20 24 44 30  
  12 13 15 34 36 47 28  
  12 28 3 40 45 52 46  
  5 23 24 33 48 50 1  
  5 10 11 17 39 48 35  
  3 17 21 36 37 40 53  
  11 20 27 50 54 55 24  

我想计算每个数字重复多少次,所以我使用这个脚本:

#!/bin/bash

for n in {1..56}
do
   echo $n >> barchart.txt
   grep -o -i $n text_file.txt | wc -l >> barchart.txt
done

我工作正常,唯一的问题是当我搜索 1 时,它也将 10,11,12...,19 视为 1。我想知道 1 单独重复了多少次,所有的都会发生同样的情况一个数字的数字:2,3,4,5,6,7,8 和 9。我尝试做类似的事情:“$n”或“$n”,但它不起作用,我也在看grep 的选项,但我没有看到正确的选项

标签: linuxbashawkgrepcounting

解决方案


这个工作比较适合awk

考虑这个gnu-awk命令:

awk -v RS='[[:space:]]+' '{++freq[$1]} END{for (i in freq) print i, freq[i]}' file

1 1
2 1
3 2
5 2
9 1
10 1
11 3
12 2
13 1
14 1
15 2
16 1
17 2
19 1
20 2
21 1
23 1
24 3
25 1
27 1
28 2
29 2
30 1
31 1
33 1
34 1
35 1
36 3
37 1
39 1
40 2
44 2
45 1
46 1
47 1
48 2
50 4
52 1
53 1
54 3
55 1

如果你没有,gnu-awk那么你可以使用这个 POSIX awk 命令:

awk '{for (i=1; i<=NF; i++) ++freq[$i]} END{for (i in freq) print i, freq[i]}' file

推荐阅读