Text-Processing
如何根據 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 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