我有一个文件(bigfile.txt),其中一列看起来像这样
NW_017095471.1 Gnomon mRNA 108321 109565 . + . ID=rna34;Parent=gene27;Dbxref=GeneID:108565285,Genbank:XM_017925071.1;Name=XM_017925071.1;gbkey=mRNA;gene=LOC108565285;model_evidence=Supporting evidence includes similarity to: 7 Proteins%2C and 100%25 coverage of the annotated genomic feature by RNAseq alignments%2C including 30 samples with support for all annotated introns;product=transmembrane protein 126A;transcript_id=XM_017925071.1
ID=gene27;Dbxref=GeneID:108565285;Name=LOC108565285;gbkey=Gene;gene=LOC108565285;gene_biotype=protein_coding
ID=gene28;Dbxref=GeneID:108569527;Name=LOC108569527;gbkey=Gene;gene=LOC108569527;gene_biotype=protein_coding
ID=gene78;Dbxref=GeneID:108562956;Name=LOC108562956;gbkey=Gene;gene=LOC108562956;gene_biotype=protein_coding
我有一个单独的列表:
gene27
gene28
我想获取每一行并 grep ID 字段,然后返回“Name =”后面的“LOC#”。
gene=$line
`grep $gene";" bigfile.txt | sed -e 's/Name=
返回
LOC108565285
LOC108569527
我该如何去提取这部分?
假设这是GFF 文件的第 9 个制表符分隔字段(“属性”字段),您可以提取与特定属性(从单独的文件中读取)
gene
对应的属性值,如下所示:ID
awk
在一个名为 GFF 的文件上运行它,该文件
file.gff
包含第 9 列中的给定数据,基因 ID 列表位于id.list
:FNR == NR
基因 ID 列表是从代码块中的第一个文件中读取的awk
,而最后一个块正在处理命令行中给出的第二个(以及所有以后的)文件中的基因特征行的属性字段(仅)。该
awk
代码假定 GFF 文件的ID
和gene
属性仅包含单个值(不是逗号分隔的值列表)并且这些值没有被引用。要将输出作为基因名称和基因 ID 列表(两列),请将
print gene
语句更改为print id, gene
.这需要重构,但应该做你想做的事:
我会使用稍微不同的方法。首先,只提取 ID 和 Name 字段:
然后,使用目标 ID 列表过滤:
或者,如果你只想要这个
LOC....
值,并假设你有 GNUgrep
:安全的。简单的。短的。
顾名思义
bigfile.txt
,我们不想 grep 多次通过它,而是一次性完成。所以我更喜欢@Kusalananda 之类的尝试:收集所有基因 ID 以提取,而不是扫描一次bigfile
. 对于我更喜欢这样的任务sed
,因为您不需要处理变量、数组和循环之类的编程,只需让工具完成工作:这是解释:
/^gene[0-9]*$/
是一种选择列表行的模式:仅gene
带有一个数字{s/$/;/;H;d;}
仅对上面的行执行:s/$/;/
附加 a;
,H
将此修改的行附加到保留空间并d
停止进一步处理并删除该行bigfile.txt
并且保存空间充满了所有基因ID。现在G
将此列表附加到模式空间/ID=\(gene[0-9]*;\).*\n\1/
选择在换行符之后gene[0-9]*
重复 ID 的行(\1
指的是第一对中的字符串\(\)
),因此 ID 存在于列表中!d
反转选择并删除,所有没有匹配的行都被删除gene
字段:s/.*gene=\(LOC[0-9]*\);.*/\1/
通过以下简单脚本完成
命令
输出
尝试这个
尝试这个,
grep -o 'Name=[^;]*'
使用 grep 模式以 "Name=" 开头并立即结束 ";"sed 's/Name=//g';
只需根据您的要求删除不需要的模式。