Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 通过使用AWK循环一定数量的记录,在字段2中查找最小值_Bash_Shell_Awk_Gawk - Fatal编程技术网

Bash 通过使用AWK循环一定数量的记录,在字段2中查找最小值

Bash 通过使用AWK循环一定数量的记录,在字段2中查找最小值,bash,shell,awk,gawk,Bash,Shell,Awk,Gawk,数据集文件中有三个字段 字段1充当id 字段2用于比较最小值 字段3为布尔值0或1 我需要在字段2中找到关于字段1的最小值。 也就是说,考虑下面的数据集。 数据集 我需要比较前3条记录的字段2中的值,并检查字段2中的最小值是否为字段3的值=1。如果是这样,++计数 然后在字段2中再次查找min,但对于字段1=2的记录。也就是说,只有记录4和5。以此类推 最好的办法是什么?该文件包含约2000000条记录 是否可以对字段2进行排序,然后为字段1的每个不同值取一条记录?最简单的方法是 $ sort

数据集文件中有三个字段

字段1充当id

字段2用于比较最小值

字段3为布尔值0或1

我需要在字段2中找到关于字段1的最小值。 也就是说,考虑下面的数据集。

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

然后在字段2中再次查找min,但对于字段1=2的记录。也就是说,只有记录4和5。以此类推

最好的办法是什么?该文件包含约2000000条记录

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

最简单的方法是

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

1 0.12  1
2 0.056 0
3 0.982 0
计算总数

$ sort -n file | awk '!a[$1]++{sum+=$3} END{print sum}'
1
但是,如果字段2中存在匹配项,并且您希望选择最后一个字段1的记录,则必须对字段3进行反向排序,即
sort-k1,2n-k3r

解释

![$1]+
是一种
awk
习惯用法,用于为字段1选择第一个唯一条目。在逻辑上,创建与键映射的计数器将仅对第一个条目为真(由于求反和值自动转换为布尔值)


排序:前两个字段按升序排序(但数字排序为2<11),第三个字段按降序排序(相反),因此1将出现在0之前。因为最后一个字段是一位数字,所以数字排序或词法排序无关紧要,否则您也希望它是数字的。

您能解释一下代码吗!a[$1]+'?我不明白这部分。另外,请解释sort-k1 2n-k3r。我在谷歌上搜索到,-k1是我们用来排序的字段,-k3r是我们按相反顺序排序的字段。但是你能解释一下吗?一次发生的事情太多了。学习这些的最好方法是在简单文件上测试不同的标志。非常感谢,我需要这个解释来理解它的工作原理。
$ sort -n file | awk '!a[$1]++{sum+=$3} END{print sum}'
1