1

我有两个文件,其中一个看起来像这样:

FILE1

>comp0_c0_seq1 len=392 path=[1:0-391]
ATGAG...
>comp1_c0_seq1 len=399 path=[1:0-398]
AAGGA...
>comp1_c1_seq1 len=589 path=[1319:0-588]
TATAT...
>comp2_c0_seq2 len=340 path=[1:0-339]
GGAGT...
>comp2_c1_seq1 len=312 path=[924:0-311]
GGTTA...
>comp2_c1_seq2 len=312 path=[924:0-311]
TTATT...
>comp4_c0_seq1 len=800 path=[1:0-581 1284:582-799]
AGAGA...
>comp6_c0_seq1 len=245 path=[815:0-151 745:152-244]
GATTA...

还有第二个文件

FILE2

>contig_1
>contig_2
>contig_3
>contig_4
>contig_5
>contig_6
>contig_7
>contig_8

我找不到模式,FILE1所以我可以很容易地用等等替换>comp0_c0_seq1零件>contig_1FILE2没有序列,只有标题

我一直在尝试,sedawk我没有成功

我希望得到的输出是:

>contig_1 len=392 path=[1:0-391]
ATGAG...
>contig_2 len=399 path=[1:0-398]
AAGGA...
>contig_3 len=589 path=[1319:0-588]
TATAT...
>contig_4 len=340 path=[1:0-339]
GGAGT...
>contig_5 len=312 path=[924:0-311]
GGTTA...
>contig_6 len=312 path=[924:0-311]
TTATT...
>contig_7 len=800 path=[1:0-581 1284:582-799]
AGAGA...
>contig_8 len=245 path=[815:0-151 745:152-244]
GATTA...

我正在使用的文件长度超过 30,000 个重叠群,它们之间有非常大的序列。

4

3 回答 3

3

使用 awk:

awk '{ if(/comp/) { getline $1 < "input2"; } print }' input1
于 2013-05-23T02:10:46.640 回答
1

使用和使用这两个文件awk的头痛:getline

$ awk 'NR==FNR{a[NR]=$0;next}/^>comp/{$1=a[++i]}1' file2 file1
>contig_1 len=392 path=[1:0-391]
ATGAG...
>contig_2 len=399 path=[1:0-398]
AAGGA...
>contig_3 len=589 path=[1319:0-588]
TATAT...
>contig_4 len=340 path=[1:0-339]
GGAGT...
>contig_5 len=312 path=[924:0-311]
GGTTA...
>contig_6 len=312 path=[924:0-311]
TTATT...
>contig_7 len=800 path=[1:0-581 1284:582-799]
AGAGA...
>contig_8 len=245 path=[815:0-151 745:152-244]
GATTA...

这假设file1file2具有相同数量的>comp0_c0_seq1>contig_8


如果您只想增加>contig_,那么您根本不需要file2

$ awk '/^>comp/{$1=">contig"++i}1' file1
>contig1 len=392 path=[1:0-391]
ATGAG...
>contig2 len=399 path=[1:0-398]
AAGGA...
>contig3 len=589 path=[1319:0-588]
TATAT...
>contig4 len=340 path=[1:0-339]
GGAGT...
>contig5 len=312 path=[924:0-311]
GGTTA...
>contig6 len=312 path=[924:0-311]
TTATT...
>contig7 len=800 path=[1:0-581 1284:582-799]
AGAGA...
>contig8 len=245 path=[815:0-151 745:152-244]
GATTA...
于 2013-05-23T09:17:09.687 回答
0

Python 2.7 解决方案(将所有 FILE1 拉入内存,因此 perreal 的解决方案应该是您的首选)

from __future__ import print_function
import re

pat = re.compile('(>comp.*?) .*?(?=(>comp|\Z))', re.DOTALL)
with open('FILE1') as f, open('FILE2') as f2:
  data = f.read()
  for fragment in pat.finditer(data):  
    fragment = fragment.group(0).replace(fragment.group(1), next(f2).rstrip())
    print(fragment, end='')
于 2013-05-23T02:17:06.547 回答