通过使用 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 之前。由于最后一个字段是一个数字仅数字排序或词法排序没关系,否则你也希望它是数字。
我在数据集文件中有三个字段。
字段 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 之前。由于最后一个字段是一个数字仅数字排序或词法排序没关系,否则你也希望它是数字。