我有一个需要组织一定数量的重复的文件,我的文件有 6 行 3120 行,每个成员有 1 或 2 位数字,总共 18720 个数字,每个数字有 1 或 2 位。
我想计算我的文件中有多少个 1、有多少个 2、有多少个 3 等等,直到有多少个 45,然后输出按重复次数排序最多的数字。示例:
5 7 13 25 26 44
12 21 26 28 32 44
10 20 22 26 40 44
13 18 19 20 22 23
9 15 17 19 22 43
10 19 28 29 37 45
2 8 12 13 22 35
3 23 24 26 38 39
3 14 19 20 33 43
2 3 8 35 36 43
2 8 25 29 37 43
3 24 27 29 38 44
5 20 23 32 33 40
11 17 22 26 33 36
1 6 31 32 39 44
4 22 27 31 36 43
3 6 18 22 35 44
11 13 24 28 32 33
17 22 27 29 42 44
8 9 16 23 29 44
13 19 20 33 37 40
18 21 29 31 34 44
14 15 20 31 32 41
6 32 33 40 41 43
11 17 18 31 43 44
1 9 10 22 24 34
6 8 9 35 37 38
14 18 21 36 40 43
11 16 17 32 34 38
1 5 14 22 23 24
5 19 21 22 32 45
12 17 20 22 32 44
9 27 32 38 42 44
4 12 16 26 42 45
6 7 8 16 39 42
5 6 13 18 27 28
输出:
重复次数最多的内容排在最前面
5=30 5个数字重复30次
4=28 4个重复28次
.........
.........
.........
35=0 三十五重复0次
我试过了,但是没有用,而且我也不是修改代码的专家
$ tr -s " " "\n" | sort | uniq -c | sort -n r | awk '{print $2 " = " $1}'
$ awk -v RS='\\s+' '{cnt[$0]++} END{PROCINFO["sorted_in"]="@val_num_desc"; for (i in cnt) print i" = "cnt[i]}' file
$ tr -s ' ' '\n' <file | sort | uniq -c | sort -nr | awk '{print $2 " = " $1}'
$ tr -s ' ' '\n' <nums | sort | uniq -c | sort -k1,1nr -k2n | awk '{print $2 " = " $1}'
$ awk -v RS=" +|\n" '{a[$1]++}END{for(x in a)printf "%d = %d\n",x,a[x]}' file
$ awk -v RS=" +|\n" '{a[$1]++}END{for(x in a)printf "%d = %d\n",x,a[x]}' f|sort -nr -k3
答案1
你可以做:
tr -s ' ' <file.txt | tr ' ' '\n' | sort -n | uniq -c | sort -k1,1rn -k2,2rn | sed 's/^ \+//; s/ /=/'
tr -s ' '
将使连续的空间合并为一个tr ' ' '\n'
将空格转换为换行符sort -n
将进行数字sort
运算uniq -c
会做计数sort -k1,1rn -k2,2rn | sed 's/^ \+//; s/ /=/'
将按照您想要的方式格式化输出。
例子:
$ tr -s ' ' <file.txt | tr ' ' '\n' | sort -n | uniq -c | sort -k1,1rn -k2,2rn | sed 's/^ \+//; s/ /=/'
12=44
12=22
10=32
8=43
7=20
6=33
6=29
6=26
6=19
6=18
6=17
6=13
6=8
6=6
5=40
5=38
5=31
5=27
5=24
5=23
5=9
5=5
5=3
4=42
4=37
4=36
4=35
4=28
4=21
4=16
4=14
4=12
4=11
3=45
3=39
3=34
3=10
3=2
3=1
2=41
2=25
2=15
2=7
2=4
答案2
这将计算某个数字出现的次数,并按出现次数降序排列:
$ awk '{for (i=1;i<=NF;i++) a[$i]++;} END{for (i in a)print i"="a[i]}' file | sort -rnt= -k2,2
44=12
22=12
32=10
43=8
20=7
8=6
6=6
33=6
29=6
26=6
19=6
18=6
17=6
13=6
[...snip...]
其中,44=12
表示44
重复了12
多次。
GNU awk
如果您安装了 GNU awk (gawk),则可以省去使用管道的麻烦,只需一个 awk 语句即可完成所有操作:
awk 'BEGIN{PROCINFO["sorted_in"]="@val_num_desc"} {for (i=1;i<=NF;i++) a[$i]++;} END{for (i in a)print i"="a[i]}' file
答案3
这只是 AWK 的变体(我已经很久没用过 AWK 了……)
awk -v RS="[ \n]+" '{a[$1]++} END{ for(b in a){print b,a[b] | "sort -rnk2,2"}}'