gff格式转gggenes的输入格式

其实这种问题应该用biopython解决才是正解,但本人才疏学浅,就暂时这样快速瞎搞一下。

使用prodigal得到的基因位置信息文件gff3或gff信息太多,但要用gggenes作图只需要序列名,起始坐标,结束坐标和方向(+1或-1)

直接在linux中使用awk操作,生成这四列内容

awk '!/^#/ {count[$1]++; if ($7 == "+") {print $1"_"count[$1],$4,$5,1} else if ($7 == "-") {print $1"_"count[$1],$4,$5,-1}}' input.gff3 > output.tsv

然后直接用R语言读取这些个文件,给列定义列名就好了。

输出文件形如

gff格式转gggenes的输入格式_第1张图片

以上awk代码实现的内容:

1)删除以#为开头的那些行

2)保留1,4,5列

3)若第七列(基因方向)为+,则在第四列输出1;反之,则输出-1

4)因为我的文件是prodigal预测基因的结果,所以一条序列中出现的多个基因在gff3文件中没有编号,用awk手动按其出现顺序(也即在序列上出现位置的前后)编号,如k121_560011_1,k121_560011_2。

其实这个问题很简单,但我搞了好久,最后还是问的chatgpt。刚开始先尝试过gff2gggenes的方法,可以建库,可以返回“完成”字样,但得到的csv文件是空的,不知道我错在哪里。flyingicedragon/gff2gggenes: 解析并将 gff 中需要的内容输出到 csv 文件中以供 R 包 gggenes 调用。 (github.com)

另附,从组装完的.fa文件中提取contig的len信息(第四列),并把文件名放在第一列。

#文件len1.sh(储存在我自己的账号里)
for file in /home/user/*.fa; do
   filename=$(basename "$file" .fa)
   grep "^>" "$file" | sed 's/>//' | awk -v filename="$filename" '{print filename, $1, $4}' > "/home/user/fahead/$filename.tsv"
   done

输出文件形如以下,之后直接 cat fahead/*.tsv>merge_gff.tsv 合并所有输出文件即可。

gff格式转gggenes的输入格式_第2张图片

 以上代码实现的内容:

1)找到">",即序列名的那行

2)使用sed命令将描述信息行中的">"字符去掉。

3) -v filename="$filename" 提取shell变量$filename。

4)  使用awk命令将文件名、序列ID和序列长度提取出来,并将它们输出为一个.tsv文件。

你可能感兴趣的:(linux,r语言)