从第一个匹配项到第N个匹配项之间的模式提取,然后退出(gz,zcat | sed,awk,perl)

感谢您查看这篇文章。作为回报,我将努力做到清晰,全面!

下面的情况:

  • 数百个〜GB大小的.gz档案
  • 包含标识符的有用数据列表。每个标识符都与在其中查找数据的唯一存档的名称相关联。

.gz档案的数据结构:

zcat archive.gz

    ...
    identifier_nth
    ...
    END_BLOCK
    ...
    ...
    ...
    identifier_1
    ...
    END_BLOCK
    ...
    ...
    ...
    identifier_1
    ...
    ...
    END_BLOCK
    ...
    ...
    identifier_nth
    ...
    END_BLOCK
    ...
    ...
    ...
    identifier_1
    ...
    END_BLOCK
    ...
    identifier_nth
    ...
    END_BLOCK

我目前正在:

start=$(echo "$wanted_identifier_of_list") # I cat | while read through a list of thousands identifiers for the process (here $wanted_identifier_of_list = identifier_1)
end=$(echo "END_BLOCK")

zcat nth_archive.gz | sed -n "/${start}/,/${end}/p" > ${start}.dat

它工作正常,但速度较慢,并且每个标识符提取的块过多。从第一次出现到第N次出现,我只需要其中的一小部分。

所以我想:

1)将我检索的块数限制为任意数(例如,此处N = 2) 2)退出zcat / sed或完成后或读完档案时使用的任何东西。

任何帮助都感激不尽!

非常感谢,

弗洛里安

评论
  • cvitae
    cvitae 回复

    这样的事情应该可以提前退出。但是,未经测试。

    $ zcat ... | awk -v start="identifier_1" -v end="END_BLOCK" -v n=2 '
                         !f && $0~start{f=n} f; f && $0~end{f--; if(!f) exit}'