提取字符串一部分的最简单方法?

提取字符串一部分的最简单方法?

我有一个文件(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

我该如何提取这部分?

答案1

假设这是 a 的第 9 个制表符分隔字段GFF文件(“属性”字段),您可以使用以下命令提取与gene特定属性相对应的属性值(从单独的文件中读取) :IDawk

BEGIN { FS = "\t" }

FNR == NR {
    # Read IDs into a hash as keys.
    ids[$1] = 1
    next
}

$3 == "gene" {
    # Split the attribute field into separate key-value pairs.
    n = split($9, keyvalues, ";")

    id = ""    # Not found a gene ID yet
    gene = ""  # No gene name to print

    # Loop over the key-value pairs, split them on the "="
    # and extract the gene name and gene ID.
    for (i = 1; i <= n; ++i) {
        split(keyvalues[i], attr, "=")
        if (attr[1] == "ID") {
            if (attr[2] in ids)
                id = attr[2]
            else
                next  # This line is not of interest
        }
        else if (attr[1] == "gene")
            gene = attr[2]
    }

    if (id != "" && gene != "")
        print gene
}

在名为的 GFF 文件上运行此文件,file.gff该文件包含第 9 列中的给定数据,并且基因 ID 列表位于id.list

$ awk -f script.awk id.list file.gff
LOC108565285
LOC108569527

基因 ID 列表是从代码FNR == NR块中的第一个文件中读取的awk,而最后一个块正在处理命令行上给出的第二个(以及后面所有)文件中的基因特征线的属性字段(仅)。

awk代码假定GFF 文件的IDgene属性仅包含单个值(不是以逗号分隔的值列表),并且这些值不带引号。

要获取基因名称和基因 ID(两列)列表形式的输出,请将语句更改print geneprint id, gene

答案2

这需要重构,但应该做你想要的:

while IFS=; read -r line; do grep -Fw "$line" biffile.txt; done < other_file | awk -F';' '{split($3,a,"=");print a[2]}'

答案3

我会使用稍微不同的方法。首先,仅提取 ID 和 Name 字段:

$ sed -nE 's/.*ID=([^;]*).*Name=([^;]*).*/\1 \2/p' file1
gene27 LOC108565285
gene28 LOC108569527
gene78 LOC108562956

然后,使用目标 ID 列表进行过滤:

$ cat file2
gene27
gene28
$ sed -nE 's/.*ID=([^;]*).*Name=([^;]*).*/\1 \2/p' file1 | grep -wf file2 
gene27 LOC108565285
gene28 LOC108569527

或者,如果您只想要该LOC....值,并假设您有 GNU grep

$ grep -wf file2 file1 | grep -oP 'Name=\K[^;]+'
LOC108565285
LOC108569527

答案4

通过下面的简单脚本完成

命令

for i in `cat file2`; do awk -v i="$i" -F ";" '$1=="ID="i{print $5}' file1| awk -F  "=" '{print $NF}'; done

输出

LOC108565285
LOC108569527

相关内容