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