web-dev-qa-db-ja.com

awkの絶対値が機能しませんか?

列9の絶対値が500未満のファイルの行を選択したい。列が正の場合もあれば、負の場合もあります。

awk -F'\t' '{ if ($9 < |500|) {print $0} }' > output.bam

これは今のところ機能しません..インターネット上の1ラウンドで、絶対値を使用するには追加する必要があると言われました

func abs(x) { return (x<0) ? x*-1 : x }

次に、これを列9の値と一緒に配置するにはどうすればよいですか?適切な構文が何であるかわかりません。

22
madkitty
awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {if (abs($9) < 500) print $0}'
31
Kane

迅速なワンライナーのために、私はこのアプローチを使用します:

awk -F'\t' 'sqrt($9*$9) < 500' > output.bam

入力は簡単ですが、大きなジョブの場合、sqrt()がパフォーマンスに影響を与えると思います。

18
TheAmigo

これは明白すぎますか、エレガントではありませんか?

awk -F'\t' '$9 < 500 && $9 > -500' > output.bam
4
champost

Sqrt($ 9 ^ 2)を使用すると精度が低下します。絶対値も出力する場合は、問題になる可能性があります。

ソリューション:テキストとして処理し、先頭のマイナス記号があればそれを削除します。

これにより、出力が入力と正確に一致することが保証されます。

コード

awk '{sub("^-", "", $9); if ($9 < 500) print $9}' inputfile

概要:awkを使用して絶対値を取得するには、フィールドから先頭のマイナス(-)文字を削除します(存在する場合)。

1
Romwell