33476


このようなファイルがあります。  
\-- 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}'

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


CC BY-SA 3.0
2017-03-23T01:31:40.957
33471
2017-03-27T17:33:24.040
9807
question
linux bash awk
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
使わない解の方が簡単だと思います。


CC BY-SA 3.0
2017-03-23T02:22:59.457
33476
2017-03-27T17:33:24.040
2017-03-27T17:33:24.040
2521
2521
33471
answer


参考までに、入力データ(`test.txt`)において `AAA.*` や `BBB.*` のデータが連続しているのであれば、awk
で以下の様にも書く事ができます。

[code]

    awk -F. '
      k!=$1{if(NR>1){print k FS v};k=$1;v=$2;next}
      $2>v{v=$2}
      END{print k FS v}
    ' test.txt
    
[/code]

プレフィックス(`$1`:`AAA` や `BBB` の部分)が変化した場合にリセット、同じ場合は `.`
以降の数値(`$2`)を比較して最大値を更新しています。

この方法の場合、(当然ですが)データが連続していない場合には期待する結果は得られません。

[code]

    AAA.001
    AAA.002
    AAA.003
    BBB.001
    BBB.002
    AAA.004  <-- here
    BBB.003  <-- here
    
[/code]


CC BY-SA 3.0
2017-03-25T02:47:28.433
33516
2017-03-25T02:47:28.433
33471
answer