我已经看到这个问题的变化,这有助于我进行初步猜测,主要涉及在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
这可能只是一个简单的误解,但我不确定我做错了什么。
感谢您的帮助。
答案 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:]-]
。