【问题标题】:Pull out a range of data from unique character to unique character using grep or awk使用 grep 或 awk 提取从唯一字符到唯一字符的一系列数据
【发布时间】:2014-07-31 11:46:33
【问题描述】:

我有一个中等大小的 fasta 格式文件,它有一个复杂的标题。我需要根据另一个文件中的值(一个 8 位数字)提取一个序列。我可以使用 'grep -20 "value" fasta.file' 得到序列。有些序列非常大,我经常需要调整行数才能获得整个序列。然后我必须复制并粘贴到另一个文件中。现在,我有太多值(1000)无法手动执行此操作。我发现的工具到目前为止还没有工作......

fasta 格式文件如下所示:

>transcript_cluster:RaGene-2_0-st-v1:17818557; Assembly=build-Rnor3.4/rn4; Seqname=chr6; Start=134300789; Stop=134300869; Strand=+; Length=80;
GGATCATTGATGACCATAAAAGATGTGGGAGTCGTCTGAAACATGCATGATGACCACAAC
ATTGAGAGTCTGAGGTCCAC
>transcript_cluster:RaGene-2_0-st-v1:17818559; Assembly=build-Rnor3.4/rn4; Seqname=chr6; Start=134301675; Stop=134301762; Strand=+; Length=87;
GGATCATTGATGACCAAAAAAAAAAAAACATCTGGGAGTCCTCTGAGACATCCATGATGA
CCACAACATTGGGAGTCTGAGGTCCAC

如果我使用命令 grep -4 "17818557" fasta.fa 我得到:

ATTGCGAGTCTGAGGTCCAC
>transcript_cluster:RaGene-2_0-st-v1:17818555; Assembly=build-Rnor3.4/rn4; Seqname=chr6; Start=134299894; Stop=134299978; Strand=+; Length=84;
GGATCATTGATGACCAGAAAAAAATCATCTCGGAGTCCTCTGAGACATCCATGATGACCA
CAACATTGGGAGTCTGAGGTCCAC
>transcript_cluster:RaGene-2_0-st-v1:17818557; Assembly=build-Rnor3.4/rn4; Seqname=chr6; Start=134300789; Stop=134300869; Strand=+; Length=80;
GGATCATTGATGACCATAAAAGATGTGGGAGTCGTCTGAAACATGCATGATGACCACAAC
ATTGAGAGTCTGAGGTCCAC
>transcript_cluster:RaGene-2_0-st-v1:17818559; Assembly=build-Rnor3.4/rn4; Seqname=chr6; Start=134301675; Stop=134301762; Strand=+; Length=87;
GGATCATTGATGACCAAAAAAAAAAAAACATCTGGGAGTCCTCTGAGACATCCATGATGA

grep -4 抓取上下四行。我需要做的是使用数字查询并仅提取fasta标题(>)下方的序列数据。将 fasta 标头下方的序列收集到下一个 fasta 标头会很好,即从 > 到 >。

我尝试了一些 UCSC 工具 'faSomeRecord' 和一些 perl 脚本。他们没有使用列表文件或命令行中的数字查询,无论是否添加“transcript_cluster:RaGene-2_0-st-v1:”。我认为这是冒号,或者因为标题包含可变的位置和长度。

非常感谢任何 cmets 或帮助!

编辑 30July14

感谢我在这里得到的帮助。我能够使用这个 bash 脚本将数据从一个文件获取到另一个文件:

#!/usr/bin/bash

filename='21Feb14_list.txt'
filelines=`cat $filename`

for i in $filelines ; do

        awk '/transcript/ && f==1 {f=0;next} /'"$i"'/ {f=1} f==1{print $1}' RaGene-2_0-st-v1.rn4.transcript_cluster.fa

done

这会提取序列,但会将数据截断为通配符值。有没有办法修改它,以便我可以获得整个标题?

示例输出:

>transcript_cluster:RaGene-2_0-st-v1:17719499;
ATGCCTGAGCCTTCGAAATCTGCACCAGCTCCTAAGAAGGGCTCTAAGAAAGCTATCTCT
AAAGCTCAGAAAAAGGATGGCAAGAAGCGCAAGCGTAGCCGCAAGGAGAGCTATTCCGTG
TACGTGTACAAGGTGCTGAAGCAAGTGCACCCGGACACCGGCATCTCTTCCAAGGCCATG
GGCATCATGAACTCGTTCGTGAACGACATCTTCGAGCGCATCGCGGGCGAGGCGTCGCGC
CTGGCGCATTACAACAAGCGCTCGACCATCACGTCCCGGGAGATCCAGACCGCCGTGCGC
CTGCTGCTGCCGGGGGAGCTGGCCAAGCACGCGGTGTCGGAAGGCACCAAGGCGGTCACC
AAGTACACCAGCTCCAAGTG
>transcript_cluster:RaGene-2_0-st-v1:17623679;

再次感谢!!

【问题讨论】:

  • 你的意思是像grep 表示“17818557”,然后将标题从一个“>”打印到下一个“>”,其中包含“17818557”?
  • 是的。如果能够抓取从标题到下一个标题开头的所有序列,那就太好了。标题总是以'>'开头
  • 赛勒斯的回答对你有用吗?还是您希望在该输出之前包含标题?请在您的原始问题中给出一个期望输出的示例
  • >transcript_cluster:RaGene-2_0-st-v1:17818557;组装=构建-Rnor3.4/rn4;序列名=chr6;开始=134300789;停止=134300869;链=+;长度=80; GGATCATTGATGACCATAAAAGATGTGGGAGTCGTCTGAAACATGCATGATGACCACAAC ATTGAGAGTCTGAGGTCCAC
  • grep -A3 "17818557" 是否有效,或者您是否已经尝试过?

标签: bash awk grep fasta


【解决方案1】:
$ awk '/transcript/ {f=0} /17818557/ {f=1} f==1{print}' fasta
>transcript_cluster:RaGene-2_0-st-v1:17818557; Assembly=build-Rnor3.4/rn4; Seqname=chr6; Start=134300789; Stop=134300869; Strand=+; Length=80;
GGATCATTGATGACCATAAAAGATGTGGGAGTCGTCTGAAACATGCATGATGACCACAAC
ATTGAGAGTCTGAGGTCCAC

工作原理:

代码使用一个名为f 的标志来决定是否应该打印一行。一个接一个地接受每个命令:

  • /transcript/ {f=0}

    如果行中出现“transcript”,表示标题,我们将标志设置为0

  • /17818557/ {f=1}

    如果该行包含我们的密钥17818557,我们将标志设置为1

  • f==1{print}

    如果标志是1,则打印该行。

【讨论】:

  • @skamazin 解释已添加。
  • @John1024 非常感谢!我一直看到很棒的awk 答案,但有时很难理解。真的很快,f 是由awk 保留为特殊标志变量还是您可以使用任何字符?
  • @skamazin 任何字符或名称都可以。如果你想学习awk,你可以从this one之类的教程开始。
  • @John1024 实际上我几天前就开始了!但我想我应该尝试完成它。
  • @John1024 我能够拼凑一个使用您发布的 awk 代码的 bash 脚本。但是,整个标题不会进入输出。有没有更好的方法来用 awk 完成这个循环?
【解决方案2】:
sed '1,/17818557/d;/>/,$d' file

输出:

GGATCATTGATGACCATAAAAGATGTGGGAGTCGTCTGAAACATGCATGATGACCACAAC
ATTGAGAGTCTGAGGTCCAC

带标题:

id=17818557
sed "/$id/p;1,/$id/d;/>/,\$d" file

输出:

>transcript_cluster:RaGene-2_0-st-v1:17818557; Assembly=build-Rnor3.4/rn4; Seqname=chr6; Start=134300789; Stop=134300869; Strand=+; Length=80;
GGATCATTGATGACCATAAAAGATGTGGGAGTCGTCTGAAACATGCATGATGACCACAAC
ATTGAGAGTCTGAGGTCCAC

【讨论】:

  • 有没有办法获取标题行呢?这有点重要。再次感谢!
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多