Text-Processing

如何根據 Unix 中的門檻值從文件中刪除行?

  • April 16, 2022

我有一個包含不同列的輸入文件,如下所示:

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 shell 中執行了以下命令:

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

但是,我仍然有第一個輸入文件,所有行……

命令有錯嗎?辨識設定的門檻值可能有問題嗎?

我正在使用 Linux。

你的表達不太正確——應該是

a >= b

或(如果您願意)

!(a < b)

而不是a!"<b".

但是,在您的特定情況下,存在一個更微妙的問題,即數值小於可表示為雙精度(64 位)浮點數的最​​小值。

如果您有gawk使用 GNU MPFR/MP 庫建構的 GNU awk ( ) 版本,您可能需要通過-M--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 double 範圍之外的值強制為零(因為它們最初被轉換為字元串,並且字元串的數值為 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

引用自:https://unix.stackexchange.com/questions/659158