2012-05-12 4 views
1

列Yは正の値のみが含まれている場合は、各個別要素の列Yにおけるフロートの最大値を見つける方法を、以下のawkコマンドが正常に動作します:は、列X

$ 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_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_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_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)を見て、私が数値として実行される>比較を強制的に$ 2へ0を追加しようとしましたが、まだできません私の問題の解決策を見つける。どんなアイデアも歓迎です!

答えて

2

あなたの問題は演算子がinよりも堅く結びついているため、をかっこにすると、つまり(! ($1 in a))となります。

関連する問題