在awk中,如何在列Y中为列X中的每个不同元素找到浮点数的最大值

时间:2012-05-12 17:07:04

标签: comparison awk numbers

如果列Y仅包含正值,则以下awk命令正常工作:

$ echo -e "g1 2\ng1 3\ng2 4\ng2 1\ng3 1" > input_pos.txt
$ cat input_pos.txt
g1 2
g1 3
g2 4
g2 1
g3 1
$ awk '{if(! $1 in a)a[$1]=$2; else if($2 > a[$1])a[$1]=$2} END{for(i in a) print i,a[i]}' input_pos.txt
g1 3
g2 4
g3 1

只要至少有一个正数,它也可以正常工作:

$ echo -e "g1 2\ng1 -3\ng2 4\ng2 1\ng3 1" > input_pos-neg.txt
$ cat input_pos-neg.txt
g1 2
g1 -3
g2 4
g2 1
g3 1
$ awk '{if(! $1 in a)a[$1]=$2; else if($2 > a[$1])a[$1]=$2} END{for(i in a) print i,a[i]}' input_pos-neg.txt
g1 2
g2 4
g3 1

但是,当只有负数时,它不起作用:

$ echo -e "g1 -2\ng1 -3\ng2 -4\ng2 -1\ng3 -1" > input_neg.txt
$ cat input_neg.txt
g1 -2
g1 -3
g2 -4
g2 -1
g3 -1
$ awk '{if(! $1 in a)a[$1]=$2; else if($2 > a[$1])a[$1]=$2} END{for(i in a) print i,a[i]}' input_neg.txt
g1
g2
g3

此示例中的同意:

$ echo -e "g1 -2\ng1 -3\ng2 4\ng2 1\ng3 1" > input_neg2.txt
$ cat input_neg2.txt
g1 -2
g1 -3
g2 4
g2 1
g3 1
$ awk '{if(! $1 in a)a[$1]=$2; else if($2 > a[$1])a[$1]=$2} END{for(i in a) print i,a[i]}' input_neg2.txt
g1
g2 4
g3 1

我查看了gawk手册(Conversions of strings and numbers),我尝试将+0添加到$ 2以强制执行>比较要作为数字执行,但仍无法找到我的问题的解决方案。欢迎任何想法!

1 个答案:

答案 0 :(得分:2)

您的问题是,!运营商与in的关系更加紧密,因此,如果您将(! $1 in a)加上括号,即(! ($1 in a)),则可以运作。