【问题标题】:print lines with blank in file using awk使用 awk 在文件中打印带有空白的行
【发布时间】:2016-04-02 07:06:18
【问题描述】:

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

【问题讨论】:

  • 代替测试 NF==4
  • 你的程序对我来说很好——你确定你的字段是制表符分隔的吗?此外,如果您愿意,可以将其写成更短的awk 'BEGIN {FS="\t"} !$5'。而且由于您的字段似乎没有内部空格,awk '!$5' 可能也会这样做。
  • awk '!$5' 将失败,如果 $5 中的任何内容以数值计算为零。 @Chris 进行调试,运行此脚本:tr '\t' '#' < input 并编辑您的问题以显示输出的内容。

标签: awk


【解决方案1】:

我不确定您为什么要指定制表符 (\t) 的字段分隔符 (FS)。仅当您有 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

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 2016-07-30
    • 1970-01-01
    • 2015-06-01
    • 2013-08-23
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多