【问题标题】:Extract a pattern using awk in a specific column在特定列中使用 awk 提取模式
【发布时间】:2017-10-21 15:58:53
【问题描述】:

我想通过只取最后一列的一个特定部分来修改文件(gff3 格式)!

我的文件看起来像这样,九列由制表符分隔:

NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0 ID=cds20267;Parent=rna22739;Dbxref=GeneID:107513619,Genbank:XP_016006018.1;Name=XP_016006018.1;gbkey=CDS;gene=A3GALT2;product=alpha_1%2C3-galactosyltransferase_2 protein_id=XP_016006018.1 p>

我只想提取最后一列 ($9) 中的基因名称 (;gene=XXX;)。 输出:

NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0 A3GALT2

完成此操作后,我想将第 4、5、7、8 列和从第 9 列提取的值合并到一个唯一列中 预期输出:

A3GALT2 1220137 1220159 - 0

我尝试使用awk 仅在最后一列中采用模式gene=xxxx。我的基因名称是带或不带数字的大写字母;并由';'分隔第九列的分号。

awk  FS "[ \t]" '$9 ~/gene=[A-Z0-9]$/ {print $0, $4, $5, $7, $8}' <file>

它不工作。还有其他方法可以使用awksedgrep 更好吗?

提前感谢您的帮助。

【问题讨论】:

  • 您希望输出为NW_015494524.1 Gnomon CDS 1220137 1220159 . - 0 A3GALT2NW_015494524.1 Gnomon CDS 1220137 1220159 . - 0,请向我们解释一下?
  • 是的,抱歉。我想分两部分做,但我可以一次做完。我想要基因名称、位置、链和相位。感谢您的解决方案。

标签: awk


【解决方案1】:

遵循 awk 应该对您有所帮助。

awk '{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));$NF=""} 1'  Input_file

输出如下。

NW_015494524.1 Gnomon CDS 1220137 1220159 . - 0 A3GALT2

编辑:正如我在 cmets 中提到的那样,我很困惑你需要哪个输出,以防你需要第二个显示的输出,下面可能会帮助你。 p>

awk '$9 ~ /.*gene=/{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));print $9,$4,$5,$7,$8} '  Input_file

输出如下。

A3GALT2 1220137 1220159 - 0

【讨论】:

    【解决方案2】:

    一个简单的awk解决方案

    $ awk '{match($9,/gene=(\w+);/,a); print a[1],$4,$5,$7,$8}' file
    A3GALT2 1220137 1220159 - 0
    

    {match($9,/gene=(\w+);/,a); :这将匹配$9 中的正则表达式gene=(\w+); 和捕获组(\w+),这将存储在数组a 中,仅此而已。

    【讨论】:

    • 谢谢。好的,所以要排除我需要在基因名称周围添加 () 的数组的gene=。如果我不放a,默认情况下捕获存储在数组$ 0中吗?
    • @Nico64:您不必将() 放入源输入文件中。 () in match 函数告诉捕获括号内提到的模式。此外,如果我们没有在match 函数中指定a,那么它不会被存储,但我们可以使用RSTARTRLENGTH 参数,它们在调用match 函数时默认设置。 RSTART表示第一个匹配字符的索引,不匹配为0,RLENGTH为长度,不匹配为-1。
    • 好的。是的,对于括号,我的意思不是在 infile 中的基因名称周围,而是在 awk 命令中仅将名称作为存储的模式。
    【解决方案3】:

    awk解决方案:

    awk '{ split($9,a,";"); print substr(a[6],6),$4,$5,$7,$8 }' file
    
    • split($9,a,";") - 使用 ; 作为分隔符将第 9 个字段拆分为块数组a

    • substr(a[6],6) - 从子字符串gene=XXXXXXXX中提取所需的基因名称@

    输出:

    A3GALT2 1220137 1220159 - 0
    

    【讨论】:

      【解决方案4】:

      感谢您的回复和帮助。是的,我想要你制作的输出。只保留基因名称、位置、链和相位信息。它们将用作新 fasta seq 的标题。我会尝试这些命令。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 2012-03-06
        相关资源
        最近更新 更多