通过使用 AWK 遍历一定数量的记录来查找字段 2 中的最小值

Find min values in field 2 by looping through certain number of records using AWK

我在数据集文件中有三个字段。

字段 1 作为 id

字段2用于比较min

字段 3 是布尔值 0 或 1。

我需要在字段 2 中找到最小值,但相对于字段 1。 也就是说,考虑以下数据集。

数据集

1 0.432 0 
1 0.12  1
1 0.298 0
2 0.056 0
2 0.06  1
3 0.982 0

我需要比较前 3 条记录的字段 2 中的值,并检查字段 3 的值是否为字段 2 中的最小值 = 1。如果是,++count。

然后在字段 2 中再次查找 min 但对于字段 1 = 2 的记录。即仅记录 4 和 5.and 依此类推...

处理它的最佳方法是什么?该文件包含大约 2,000,000 条记录。

是否可以对字段 2 进行排序,然后对字段 1 的每个不同值取一条记录?

最简单的...

$ sort -n file | awk '!a[]++'

1 0.12  1
2 0.056 0
3 0.982 0

计算总和

$ sort -n file | awk '!a[]++{sum+=} END{print sum}'
1

但是,如果在字段 2 中有匹配项,并且您想选择最后一个字段 1 的记录,则必须对字段 3 进行反向排序,即 sort -k1,2n -k3r

说明

!a[]++awk 成语 select 字段 1 的第一个唯一条目。创建一个用键映射的计数器,逻辑上仅对第一个条目为真(由于取反并自动将值转换为布尔值)

排序:前两个字段按升序排列(但数字排序所以 2 < 11),第三个是降序(相反)因此 1 将出现在 0 之前。由于最后一个字段是一个数字仅数字排序或词法排序没关系,否则你也希望它是数字。