2016-03-19 66 views
0

在下面的input文件中,我使用awk打印出$5中的blank行。 awk會運行並輸出結果,但它是整個輸入文件,而不僅僅是空白的行。我的awk版本是GNU 4.0.1。謝謝:)使用awk打印文件中的空白文件

輸入

chr6 32945523 32945792  chr6:32945523-32945792  BRD2-351|gc=50 
chr6 32945892 32946175  chr6:32945892-32946175  BRD2-352|gc=53.5 
chr6 32946856 32946981  chr6:32946856-32946981 
chr6 32947594 32947919  chr6:32947594-32947919  BRD2-354|gc=51.2 

期望的結果

chr6 32946856 32946981  chr6:32946856-32946981 

AWK

cat input | awk 'BEGIN {FS="\t"} $5=="" {print}' 

電流輸出

cat input | awk 'BEGIN {FS="\t"} $5=="" {print}' 
chr6 32945523 32945792  chr6:32945523-32945792  BRD2-351|gc=50 
chr6 32945892 32946175  chr6:32945892-32946175  BRD2-352|gc=53.5 
chr6 32946856 32946981  chr6:32946856-32946981 
chr6 32947594 32947919  chr6:32947594-32947919  BRD2-354|gc=51.2 
chr6 32948108 32948251  chr6:32948108-32948251  BRD2-355|gc=43 

編輯:以下awk作品,但我不知道爲什麼原來沒有

awk '$5==""' input 
+3

替代測試NF == 4 – stark

+1

您的程序對我來說工作正常---您確定您的字段是製表符分隔的嗎?同樣,如果你喜歡,你可以寫成它比awk更短一些。BEGIN {FS =「\ t」}!$ 5''。既然看起來你的領域沒有內部空間,'awk'!$ 5''也可以做到這一點。 – jas

+1

'awk'!$ 5''將會失敗,如果'$ 5'中的任何值在數值上被評估爲零。 @Chris來調試,運行這個腳本:'tr'\ t''#'

回答

1

我不知道爲什麼你指定一個字段分隔符(FS )的選項卡(\t)。如果您有TSV文件(製表符分隔的值,類似於CSV),那麼這應該是必需的。如果確實有TSV文件,即某些值中有空格和/或兩個連續的選項卡指示中間是空字段,則需要awk 'BEGIN {FS="\t"} …'或更短的awk -F '\t' '…'

試試這個:

awk 'NF < 5' input 

如果你有一個TSV格式,包括一些空字段,試試這個:

awk -F '\t' '$5 == ""' input 

這裏是給定的HTML無力代表標籤更可靠的測試:

sample() { 
    echo 'chr6\t32945523\t32945792\tchr6:32945523-32945792\tBRD2-351|gc=50' 
    echo 'chr6\t32945892\t32946175\tchr6:32945892-32946175\tBRD2-352|gc=53.5' 
    echo 'chr6\t32946856\t32946981\tchr6:32946856-32946981' 
    echo 'chr6\t32947594\t32947919\tchr6:32947594-32947919\tBRD2-354|gc=51.2' 
    echo 'chr6\t32947594\t32947919\tchr6:32947594-32947919\t\ttest' 
    echo 'chr6\t32947594\t\tchr6:32947594-32947919\tBRD2-354|gc=51.2' 
} 

echo "unfiltered" 
sample 

echo "testing awk 'NF < 5'" 
sample |awk 'NF < 5' 

echo "\ntesting awk -F '\\\\t' '\$5 == \"\"'" 
sample |awk -F '\t' '$5 == ""' 

sample()的最後兩行說明了awk的默認值(FS="[ \t]+",匹配一個或多個空格字符)和FS="\t"

默認情況下,由於字段3和字段5之間的空白處於摺疊狀態(TSV字段5爲awk字段4),您將得到該短行加最後一行。 「測試」線將TSV字段6摺疊到awk字段5中,所以默認會錯過它。

更改後的字段分隔符也會得到該短行。它會計算TSV的字段,注意到「測試」行有一個空的第五個條目(「test」是它的第六個條目),最後一行的缺失第三個字段被標記爲空而不是摺疊,所以「BRD2」值是作爲第五個TSV領域正確指出。

unfiltered 
chr6 32945523 32945792 chr6:32945523-32945792 BRD2-351|gc=50 
chr6 32945892 32946175 chr6:32945892-32946175 BRD2-352|gc=53.5 
chr6 32946856 32946981 chr6:32946856-32946981 
chr6 32947594 32947919 chr6:32947594-32947919 BRD2-354|gc=51.2 
chr6 32947594 32947919 chr6:32947594-32947919  test 
chr6 32947594  chr6:32947594-32947919 BRD2-354|gc=51.2 

testing awk 'NF < 5' 
chr6 32946856 32946981 chr6:32946856-32946981 
chr6 32947594  chr6:32947594-32947919 BRD2-354|gc=51.2 

testing awk -F '\t' '$5 == ""' 
chr6 32946856 32946981 chr6:32946856-32946981 
chr6 32947594 32947919 chr6:32947594-32947919  test 
+0

謝謝大家:) – Chris

相關問題