我有一个包含浮点格式数字的文件。我可以通过 “我希望能够对它们进行“分组””来
查看它们。sort -rn numbers.txt | less
即很容易看出有多少个在同一范围内。
举一个文件的例子:
30.9695041179657
30.8851490020752
30.2127060890198
29.1361880302429
26.4587681293488
25.8535399436951
25.7361891269684
25.7305450439453
25.1068568229675
24.7598769664764
24.3106801509857
24.0782940387726
我不关心准确性。所以我想知道文件中的所有数字有多少个 25,例如在本例中为 4 和 30 等。
因此,对于此示例,输出如下:3 代表 30、1 代表 29、1 代表 26、4 代表 25、3 代表 24。
有没有一种简单的方法可以做到这一点?
答案1
怎么样
cut -d. -f1 numbers.txt | sort | uniq -c
使用您的示例数据,
$ cut -d. -f1 numbers.txt | sort | uniq -c
3 24
4 25
1 26
1 29
3 30
答案2
和awk
(mawk
):
$ awk -F . '{COUNTS[$1]++} END{for(ct in COUNTS) {printf("%d %d time(s)\n", ct, COUNTS[ct])}}' test.txt
30 3 time(s)
24 3 time(s)
25 4 time(s)
26 1 time(s)
29 1 time(s)
-F
将字段分隔符 ( FS
) 设置为,.
除了我们使用 遍历所有行之外{COUNTS[$1]++}
,使用$1
用作小数点分隔符 () 之前的部分.
,并记录我们在名为 的数组中遇到它们的次数COUNTS
。
最后 ( END {}
) 我们转储我们发现的内容。正如你所看到的,最大的部分是输出。
在文件中更具可读性:
{COUNTS[$1]++}
END {
for(ct in COUNTS)
{
printf("%d %d time(s)\n", ct, COUNTS[ct])
}
}
答案3
你可以使用awk
:
awk '{a[int($1)]++}END{for (i in a) {print a[i], i}}' inputfile
如果您希望对输出进行排序,请将输出通过管道传输到sort
:
awk '{a[int($1)]++}END{for (i in a) {print a[i], i}}' inputfile | sort -k2
对于您的示例输入,这将产生:
3 24
4 25
1 26
1 29
3 30
答案4
看来你的文件已经排序了,所以你可以这样做:
$ uniq -c <(perl -pe 's/\.\d*//' file)
3 30
1 29
1 26
4 25
3 24
如果还没有排序:
$ uniq -c <(perl -pe 's/\.\d*//' file | sort -rn)
3 30
1 29
1 26
4 25
3 24