awkでグループ化して最大値を出したい


このようなファイルがあります。  
\-- test.txt --  
AAA.001  
AAA.002  
AAA.003  
BBB.001  
BBB.002

から、  
AAA.003  
BBB.002  
というように、AAAに続く最大値、BBBに続く最大値を取得できないでしょうか。

現在は、

cat test.txt | awk '$0 ~ "AAA" {print $0}' | awk '{field = $NF} END {print
field}'

のように一つずつやっています。  
よろしくお願いいたします。




AWK 使うと `001` とかが数値の 1 に勝手に変換されて面倒なのであまりおすすめしませんが、`.` 以降が 3 桁決め打ちで

[code]

    awk -F '\\.' '
    {
      key = $1;
      old = -1;
      if (key in alist) {
        old = alist[key];
      };
      new = $2;
      if (new > old) {
        alist[key]= new
      }
    }
    END{
      for (key in alist){
        printf "%s.%03d\n", key, alist[key];
      }
    }' test.txt
    
[/code]

と FS を `.` にし、`alist` という配列にキーを `AAA` の部分、値を `001` の数値表現に格納していき、最後に表示してます。

数値部分が3桁とは限らないのであれば、`alist`
への出し入れで数値←→元の文字列への変換をするとか、何らかの工夫が必要になってくるので、既にコメントに出てるような AWK
使わない解の方が簡単だと思います。




AWK 使うと `001` とかが数値の 1 に勝手に変換されて面倒なのであまりおすすめしませんが、`.` 以降が 3 桁決め打ちで

[code]

    awk -F '\\.' '
    {
      key = $1;
      old = -1;
      if (key in alist) {
        old = alist[key];
      };
      new = $2;
      if (new > old) {
        alist[key]= new
      }
    }
    END{
      for (key in alist){
        printf "%s.%03d\n", key, alist[key];
      }
    }' test.txt
    
[/code]

と FS を `.` にし、`alist` という配列にキーを `AAA` の部分、値を `001` の数値表現に格納していき、最後に表示してます。

数値部分が3桁とは限らないのであれば、`alist`
への出し入れで数値←→元の文字列への変換をするとか、何らかの工夫が必要になってくるので、既にコメントに出てるような AWK
使わない解の方が簡単だと思います。

