加入并删除基于patern的行

时间:2016-07-28 09:20:59

标签: bash shell awk sed vi

我有一个包含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)打印a; a = $ 0} / ^(FRAG)/ {a = a" " $ 0}' Input.txt> output.txt

结果如下:

  

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

1 个答案:

答案 0 :(得分:2)

这有效:

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

下一个声明是避免检查FRAG模式(如果它是带有IMAGE的行),从而加快了过程。