使用awk在文件中打印空白行

时间:2016-03-19 13:24:36

标签: awk

在下面的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

1 个答案:

答案 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