bash - 根据模式连接和删除行

标签 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)print a; a=$0} /^(FRAG)/{a=a" "$0}' Input.txt > output.txt

结果如下:

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

最佳答案

这有效:

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

下一条语句是避免检查 FRAG 模式(如果它是带有 IMAGE 的行),从而加速该过程。

关于bash - 根据模式连接和删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38632141/

相关文章:

linux - 如何简化匹配 IP 地址的 if-else 语句

linux - 如何用新的标题和结尾字符串替换目录中所有文件的标题和结尾,但仅限于特定字符?

unix - 如何对 AWK 中的列求和?

windows - Windows 上的 Nginx - 无法绑定(bind)任何端口

linux - 从 gzip 文件的开头剥离 bash 脚本

ios - 如何仅在 Debug模式下启用3D触摸(静态快速操作)?

linux - 批量多重命名工具

linux - 根据列值分割大文件 - linux

linux - bash - 找不到 make 命令

bash - 如何在 Bash 中的另一个函数中定义一个函数?