根据模式加入和删除线

Join and delete lines based on patern

我有一个包含 200,000 多行的文件。线被分组。每组行的开头以 "IMAGE" 开头,然后是一行以 "HISTO" 开头,然后是至少一行,但通常是多行,以 "FRAG" 开头。 我需要:
1. 删除任何以 "HISTO".
开头的行 2. 对于每个 "FRAG" 行,我需要将其与前一个 "IMAGE" 行连接起来。 这是一个例子。

>IMAGE ...data1...  
>HISTO usually numbers 0 0 1 1 0 1 0  
>FRAG ...data1...  
>FRAG ...data2...  
>IMAGE ...data2...  
>HISTO usually numbers 0 0 1 1 0 1 0   
>FRAG ...data1...  
>FRAG ...data2...  
>FRAG ...data3...  
>FRAG ...data4...

结果需要如下所示:

>IMAGE ...data1... FRAG ...data1...  
>IMAGE ...data1... FRAG ...data2...  
>IMAGE ...data2... FRAG ...data1...  
>IMAGE ...data2... FRAG ...data2...  
>IMAGE ...data2... FRAG ...data3...  
>IMAGE ...data2... FRAG ...data4...  

在以 IMAGE 行重新开始之前,可能有许多 FRAG 行。我正在使用 mac,所以我几乎可以使用任何工具。

我试过了,但它是将多条 FRAG 行合并到一条 IMAGE 行。

awk '/^IMAGE/{if(NR>1)print a; a=[=12=]} /^(FRAG)/{a=a" "[=12=]}' Input.txt > output.txt

结果是:

IMAGE ...data1... FRAG ...data1... FRAG ...data2...

这个有效:

sed 's/>//' Input.txt|awk '/^IMAGE/{a=[=10=];next;} /^FRAG/{print ">"a,[=10=]}'

接下来的语句是为了避免检查FRAG模式是否与IMAGE是一条线,从而加快进程。