【问题标题】:Join and delete lines based on patern基于模式加入和删除线
【发布时间】:2016-12-02 14:18:47
【问题描述】:

我有一个超过 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

结果如下:

图像 ...data1... FRAG ...data1... FRAG ...data2...

【问题讨论】:

  • @Inian 我编辑了原始消息以包含我尝试过的内容。至少它删除了 HISTO 行。但它结合了 FRAG 线条,使其成为一排。

标签: bash shell awk sed vi


【解决方案1】:

这行得通:

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

下一条语句是避免检查 FRAG 模式,如果它是带有 IMAGE 的行,从而加快进程。

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多