我正在使用此命令来 grep gff 文件中第一个文件中的基因列表。
grep -w -f upregulated_genes_in_BEg GCA_900659725.1_ASM90065972v1_genomic.gff
它对我不起作用..请提出任何建议。
第一个文件中的基因列表..
LOCUS10095
LOCUS10108
LOCUS10129
LOCUS10130
LOCUS10152
LOCUS10161
LOCUS10225
LOCUS10252
LOCUS10266
LOCUS10268
LOCUS10294
LOCUS10313
LOCUS10351
LOCUS10355
LOCUS10358
答案1
跳过-w
标志到grep
,因为这限制了搜索在字边界处的匹配定义为grep
(来自文档,“仅选择包含构成整个单词的匹配项的行。”)。该命令产生预期的输出:
cat > GCA_900659725.1_ASM90065972v1_genomic.gff <<EOF
CAACVG010000001.1 EMBL region 1 15202 . + . ID=CAACVG010000001.1:1..15202;Dbxref=taxon:64391;gbkey=Src;mol_type=genomic DNA;note=contig: 10000|quiver
CAACVG010000001.1 EMBL gene 4526 9821 . - . ID=gene-CALMAC_LOCUS1;Name=CALMAC_LOCUS1;gbkey=Gene;gene_biotype=protein_coding;locus_tag=CALMAC_LOCUS1
EOF
cat > upregulated_genes_in_BEg <<EOF
LOCUS1
LOCUS10095
EOF
grep -f upregulated_genes_in_BEg GCA_900659725.1_ASM90065972v1_genomic.gff
印刷:
CAACVG010000001.1 EMBL gene 4526 9821 . - . ID=gene-CALMAC_LOCUS1;Name=CALMAC_LOCUS1;gbkey=Gene;gene_biotype=protein_coding;locus_tag=CALMAC_LOCUS1
如果您需要精确控制字边界,也许这个 Perl 单行代码是更好的选择:
perl -lne 'BEGIN { @upregulated_genes_in_BEg = `cat upregulated_genes_in_BEg`; %is_upregulated_gene_in_BEg = map { $s = $_; chomp $s; ( $s => 1 ) } @upregulated_genes_in_BEg; } ( $gene ) = m{(LOCUS\w+)}; print if $is_upregulated_gene_in_BEg{ $gene }; ' GCA_900659725.1_ASM90065972v1_genomic.gff
单行代码将含有上调基因的文件内容读取到哈希值中。然后,它使用该散列来查找该散列是否LOCUS...
在当前行中包含该单词。如果散列包含该单词,则打印该行。
Perl 单行代码使用以下命令行标志:
-e
:告诉 Perl 查找内联代码,而不是在文件中。
-n
:一次循环输入一行,$_
默认将其分配给。 :在内联执行代码之前
-l
剥离输入行分隔符(默认在 *NIX 上),并在打印时附加它。"\n"
也可以看看:
perldoc perlrun
:如何执行Perl解释器:命令行开关
perldoc perlre
:Perl 正则表达式(regexes)
perldoc perlre
:Perl 正则表达式(regexes):量词;字符类和其他特殊转义;断言;捕获组
perldoc perlrequick
:Perl正则表达式快速入门