在下面的input
文件中,我使用awk
打印出blank
中$5
的行。 awk
确实运行并输出结果,但它是整个输入文件,而不仅仅是空行。我的awk
版本为GNU 4.0.1
。谢谢:))
输入
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
答案 0 :(得分: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”行有一个空的第五个条目(“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