我有两个看起来像这样的文件:
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_1
,依此类推。 FILE2
没有序列,只有标题
我一直在尝试sed
和awk
,但我没有成功
我希望获得的输出是:
>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个重叠群,它们之间的序列非常大。
答案 0 :(得分:3)
使用awk:
awk '{ if(/comp/) { getline $1 < "input2"; } print }' input1
答案 1 :(得分: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...
这假定file1
和file2
具有相同数量的>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...
答案 2 :(得分: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='')