我有一个包含 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/