1列の一連の値から3列の最大値をどのように見つけますか?

1列の一連の値から3列の最大値をどのように見つけますか?

Ubuntuシステムには次のデータセットがあります。

37.500  0.0000  0.005605
37.750  0.0000  -0.027858
38.000  0.0000  -0.060678
38.250  0.0000  -0.088557
38.500  0.0000  -0.109210
38.750  0.0000  -0.122482
39.000  0.0000  -0.129770
39.250  0.0000  -0.133190
39.500  0.0000  -0.134538
39.750  0.0000  -0.134015
40.000  0.0000  -0.129660
40.250  0.0000  -0.117858
40.500  0.0000  -0.094709
40.750  0.0000  -0.057622
41.000  0.0000  -0.006853

列1の38から40の間の列3の最大値を見つける必要があります。

これは単なるサンプルデータセットです。

ベストアンサー1

awk '$1 >= 38 && $1 <= 40 && $3 > max {max = $3; out = $0};
     END {print out}' input.txt 

注:$ 3には正の値はありません。ここで、38 <= $1 <= 40 です。これが出力が空の行になった理由です。 (なぜですか?maxデフォルトは 0 で、その上に負の値が 1 つもないからです。)

正または負のいずれかで最も高い値が必要な場合は、max$ 3から可能な最小値より小さい値に初期化してください。例えば-9999:

$ awk -v max=-9999 '$1 >= 38 && $1 <= 40 && $3 > max {max = $3; out = $0};
                    END {print out}' input.txt 
38.000  0.0000  -0.060678                

またはBEGIN代わりにブロックを使用してください-v

$ awk 'BEGIN {max=-9999};
       $1 >= 38 && $1 <= 40 && $3 > max {max = $3; out = $0};
       END {print out}' input.txt 
38.000  0.0000  -0.060678                

または、Perlを使用して予期しない値に初期化する代わりに、$ maxが定義されていないかどうかをテストします。

$ perl -lane  '
  if ($F[0] >= 38 && $F[0] <= 40 && (!defined($max) || $F[2] > $max)) {
    $max = $F[2]; 
    $out = $_;
  };
  END { print $out }'  input.txt 
38.000  0.0000  -0.060678                

おすすめ記事