使用grep或awk将一系列数据从唯一字符拉出到唯一字符

时间:2014-07-30 18:05:24

标签: bash awk grep fasta

我有一个中等大小的fasta格式文件,它有一个复杂的标题。我需要根据另一个文件中的值(8位数字)拉出序列。我可以使用' grep -20" value"来获取序列。 fasta.file&#39 ;.一些序列非常大,我经常需要调整行数以获得整个序列。然后我必须复制并粘贴到另一个文件中。现在,我有太多的值(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:'加成。我认为它是冒号或因为标题包含可变的位置和长度。

非常感谢任何评论或帮助!

编辑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;

再次感谢!!

2 个答案:

答案 0 :(得分:2)

$ 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}

    如果"成绩单"出现在行中,表示标题,我们将标记设置为0

  • /17818557/ {f=1}

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

  • f==1{print}

    如果标记为1,请打印该行。

答案 1 :(得分:1)

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