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

在awk中对列的子集进行比较(编辑:格式错误的开始),awk,Awk,我已经看到了这个问题的变化,它帮助我构思了一个初步的猜测,主要涉及在awk中对一列进行两次拆分 下面是我输入的一行示例: chr1 Cufflinks transcript 470971 471355 1000 + . gene_id "ENSG00000236679.2"; transcript_id "ENST00000458203.2"; FPKM "0.0792422960"; frac "1.000000"; conf_lo "17976931348623

我已经看到了这个问题的变化,它帮助我构思了一个初步的猜测,主要涉及在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是一个奇怪的数字,但它是用来生成这个的程序中的一个bug。)

它是以制表符分隔的,但一个字段($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
这可能只是一个简单的误解,但我不确定我做错了什么


谢谢您的帮助。

除了在
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
已经说过,您不需要第二次
拆分
。使用
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::]-]
)中添加
-

哈哈,原来这是一个比不知道如何分割更根本的错误。我想我现在要编辑标题了。谢谢