如果列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以强制执行>比较要作为数字执行,但仍无法找到我的问题的解决方案。欢迎任何想法!
答案 0 :(得分:2)
您的问题是,!
运营商与in
的关系更加紧密,因此,如果您将(! $1 in a)
加上括号,即(! ($1 in a))
,则可以运作。