如何对文件中的数字进行分组

如何对文件中的数字进行分组

我有一个包含浮点格式数字的文件。我可以通过 “我希望能够对它们进行“分组””来
查看它们。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

awkmawk):

$ 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

相关内容