Unixでしきい値に基づいてファイルから行を削除する方法は?

Unixでしきい値に基づいてファイルから行を削除する方法は?

次のような異なる列を持つ入力ファイルがあります。

VARIANT,SNP,chr,pos,A1,A2,BETA,P_value           
7:106350628_G_A,rs6977865,7,106350628,G,A,-0.0808873,8.6E-309
7:106353698_T_C,rs74804152,7,106353698,T,C,-0.0808701,9.3E-309
20:57674276_T_A,rs6026699,20,57674276,T,A,-0.0945835,6.0E-314
1:10177_A_AC,rs367896724,1,10177,A,AC,0.000264372,9.3E-01
1:10642_G_A,rs558604819,1,10642,G,A,0.0425225,7.0E-01
2:31467079_G_A,rs2295471,2,31467079,G,A,-0.0830949,8.6E-320

ここで、P値が2.23E-308より小さい行を削除して、次の出力ファイルを取得しようとしています。

VARIANT,SNP,chr,pos,A1,A2,BETA,P_value
1:10177_A_AC,rs367896724,1,10177,A,AC,0.000264372,9.3E-01
1:10642_G_A,rs558604819,1,10642,G,A,0.0425225,7.0E-01

Unixシェルで次のコマンドを実行しました。

awk -F, '$8!"<2.23E-308"' input.file > output.file

しかし、まだすべての行を含む最初の入力ファイルがあります。

順序が間違っていますか?設定されたしきい値認識に問題があるのではないでしょうか。

私はLinuxを使用しています。

ベストアンサー1

あなたの表現は正確ではありません。

a >= b

または(必要に応じて)

!(a < b)

代わりにa!"<b"

しかし、特定のケースでは、より微妙な問題があります。つまり、数値が倍精度(64ビット)浮動小数点数で表すことができる最小値より小さいということです。

gawk-MGNU MPFR / MPライブラリで構築されたGNU awk()バージョンがある場合、または--bignumコマンドラインオプションで任意の精度処理を有効にする必要があるかもしれません。

$ gawk -F, -M '$8 >= 2.23E-308' input.file
VARIANT,SNP,chr,pos,A1,A2,BETA,P_value
1:10177_A_AC,rs367896724,1,10177,A,AC,0.000264372,9.3E-01
1:10642_G_A,rs558604819,1,10642,G,A,0.0425225,7.0E-01

そうでない場合、考えられる解決策は、比較する前に数値変換を強制することです。

$ mawk -F, '$8+0 >= 2.23E-308' input.file
1:10177_A_AC,rs367896724,1,10177,A,AC,0.000264372,9.3E-01
1:10642_G_A,rs558604819,1,10642,G,A,0.0425225,7.0E-01

$ awk -F, '$8+0 >= 2.23E-308' input.file
1:10177_A_AC,rs367896724,1,10177,A,AC,0.000264372,9.3E-01
1:10642_G_A,rs558604819,1,10642,G,A,0.0425225,7.0E-01

ただし、これはIEEE二重範囲外の値を強制的に0に設定します(最初は文字列に変換され、文字列の数値はゼロであるため)。

ヘッダー行も必要な場合は、別々の論理テストとして追加してください。

awk -F, 'NR==1 || $8+0 >= 2.23E-308' input.file
VARIANT,SNP,chr,pos,A1,A2,BETA,P_value
1:10177_A_AC,rs367896724,1,10177,A,AC,0.000264372,9.3E-01
1:10642_G_A,rs558604819,1,10642,G,A,0.0425225,7.0E-01

おすすめ記事