在awk中对列的子集进行比较(编辑:格式错误的开始)
我已经看到了这个问题的变化,它帮助我构思了一个初步的猜测,主要涉及在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
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::]-]
)中添加-
哈哈,原来这是一个比不知道如何分割更根本的错误。我想我现在要编辑标题了。谢谢