Bash用第二个文件中的内容替换字符串

时间:2013-05-23 01:51:17

标签: string bash replace sed awk

我有两个看起来像这样的文件:

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没有序列,只有标题

我一直在尝试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个重叠群,它们之间的序列非常大。

3 个答案:

答案 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...

这假定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...

答案 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='')