【问题标题】:awk not printing header in output fileawk 不在输出文件中打印标题
【发布时间】:2016-07-07 22:10:39
【问题描述】:

下面的awk 似乎与1 问题配合得很好,标题行在输出中进行热打印?我一直盯着这个有一段时间没有运气。我错过了什么?谢谢你:)。

awk

awk 'NR==FNR{for (i=1;i<=NF;i++) a[$i];next} FNR==1 || ($7 in a)' /home/panels/file1 test.txt | 
awk '{split($2,a,"-"); print a[1] "\t" $0}' | 
sort | 
cut -f2-> /home/panels/test_filtered.vcf

test.txt(用于awk 以提供过滤后的输出——仅显示一小部分数据,但显示制表符分隔格式)

Chr Start   End Ref Alt
chr1    949608  949608  G   A

当前输出(没有标题)

chr1    949608  949608  G   A

想要的输出(有标题)

Chr Start   End Ref Alt
chr1    949608  949608  G   A

【问题讨论】:

  • 你能提供file1的样本吗?此外,尝试通过删除多余的管道(如 sortcut 和可能的 awks 之一)来缩小问题范围。也就是说,究竟是哪一部分失败了?
  • 您的标题将被排序,并且可能与您的数据混合在一起。
  • 标题与数据混合在一起,删除了排序工作。您能否回答@WilliamPursell,以便我接受?谢谢你:)

标签: awk


【解决方案1】:

看起来标题要排序,并与您的数据混合。一个简单的解决方案是:

... | { read line; echo $line; sort; } |

防止第一行去排序。

【讨论】:

  • 您能否详细说明一下这如何防止第一行被跳过?我用seq 2 10 | { read line; echo $line; sort; } 对其进行了测试并且工作正常,只是我不太明白它是如何做到的。
  • read line 一次从标准输入读取一个字符,直到它看到一个换行符并将该行存储在变量line 中。然后外壳打印该行。然后 sort 启动并消耗 stdin 的其余部分。这种行为是可能的,因为read 一次只能读取一个字符,并且(我相信)是read 这样做的原因。
  • 啊对,我明白了。因此,例如{ read line; read line; echo $line; } 只会打印第二行等。谢谢!
【解决方案2】:

您可以组合您的脚本并将排序添加到awk 并以这种方式处理标题。

$ awk 'NR==FNR{for(i=1;i<=NF;i++)a[$i]; next} 
        FNR==1{print "dummy\t" $0; next}
       $7 in a{split($2,b,"-"); print b[1] "\t" $0 | "sort" }' file1 file2 |
  cut -f2

【讨论】:

    最近更新 更多