在awk中对列的子集的子集进行比较(编辑:格式错误的BEGIN)

时间:2014-09-10 18:57:46

标签: awk

我已经看到这个问题的变化,这有助于我进行初步猜测,主要涉及在awk中对列进行两次拆分。

以下是我输入的示例行:

chr1    Cufflinks   transcript  470971  471355  1000    +   .   gene_id "ENSG00000236679.2"; transcript_id "ENST00000458203.2"; FPKM "0.0792422960"; frac "1.000000"; conf_lo "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000"; conf_hi "0.000000"; cov "0.233090"; full_read_support "yes";

(是的,conf_lo是一个奇怪的数字,但它是用来生成它的程序中的一个错误。)

它以制表符分隔,但是一个字段($ 9)也是分号,空格分隔为键值对。我想使用awk来过滤大于0的FPKM值($ 9中的3),这涉及两个分裂。如果过滤器通过,则应打印整条线的重新排列。到目前为止,这是我最好的猜测:

awk -F"\t" 'BEGIN {
OFS="\t";
split($9,t,";"); 
split(t[3],t3,"\""); 
if (t3[2]>0.0) {
print $1,$4,$5,$9,$6,$7;}
}' transcripts.gtf > $input.bed

这可能只是一个简单的误解,但我不确定我做错了什么。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

除了您已在BEGIN块中编写了整个脚本之外,您已经掌握了大部分内容,这意味着屏幕上没有打印任何内容,因为BEGIN块内没有读取任何行。

试试这个:

awk '
BEGIN { FS = OFS = "\t" }
{
    split ($9, t, ";"); 
    split (t[3], t3, "\""); 
    if (t3[2]>0.0) {
        print $1, $4, $5, $9, $6, $7
    }
}' transcripts.gtf > $input.bed

说过你不需要第二个split。使用gsub功能删除除数字以外的所有内容。

awk '
BEGIN { FS = OFS = "\t" }
{
    split ($9, t, ";");
    gsub (/[^.[:digit:]]+/, "", t[3]);
    if (t[3] > 0) {
        print $1, $4, $5, $9, $6, $7
    }
}' transcripts.gtf > $input.bed

如果您的值可能为负数,则可以在字符类(-)中添加[^.[:digit:]-]