如何在一场比赛之后打印直到另一场比赛

How to print after a match and until another match

我正在尝试编写脚本以便从大型文本文件中提取一定数量的行。我有一个包含要在主文件中查找的 id 编号的 id 文件,当找到匹配项时,我想打印出某些字段,直到找到结束字符串。然后我想查找所有出现的文本行,其中第一行包含相同的 ID 号,然后再读取下一个 ID 号并重新启动该过程,直到测试所有 ID 号。

文本文件如下所示:(开头格式不正确)

"part_1/group_01/p1_g01_f1_1_t-a0001"

1779 1866 小时哈尔 1866 1945 “答: 1945 1991 天du 1991 2049 "}: 2049 2115 n noen 2115 2260 ""u: 2260 2319 @ 2319 2376 N 2376 2399 g gang 2399 2514 "A 2514 2601 N 2601 2701 s sett 2701 2768 "e 2768 2804 t 2804 2909 s stokkmaur 7850 8906 <end> <end> . "part_1/group_01/p1_g01_f1_1_t-a0002" 0 1617 <start> <start> 1617 1709 f Frå 1709 1776 4 1776 1846 "O: 1846 1909 n neste 1909 2013 ""{ 2013 2101 s 2101 2177 t 2177 2216 @ 2216 2286 v veke 2286 2467 ""e: 2467 2549 k 2549 2601 @ 2601 2755 "A: av 2755 2823 v vert 2823 2930 "{ 2930 2986 <end> <end>

id 文件如下所示:

a0002 b0507 c0576

等等

所以我希望脚本在包含数字 a0002 的文本文件 (trans.txt) 中找到第一个匹配项,然后打印出所有内容,直到它与结束字符串匹配,然后打印出下一行序列第一行与 a0002 匹配,直到找到所有匹配项。然后我想从 id 文件 (b0507) 中读取下一个 id 号并重复整个过程,直到读取所有 id 号。

任意一个id搜索,可以使用sed如下,例如

sed -n "/a0002/,/<end>/p" file

这会抑制正常输出,直到找到 a0002,然后打印下一次出现的 <end> 之前的所有行。

输出

"part_1/group_01/p1_g01_f1_1_t-a0002"
0   1617    <start> <start>
1617    1709    f   Frå
1709    1776    4
1776    1846    "O:
1846    1909    n   neste
1909    2013    ""{
2013    2101    s
2101    2177    t
2177    2216    @
2216    2286    v   veke
2286    2467    ""e:
2467    2549    k
2549    2601    @
2601    2755    "A: av
2755    2823    v   vert
2823    2930    "{
2930    2986    <end>   <end>

从单独的 id-file 中读取所有 id,以空白字符分隔,并在 parts-file[=34= 中找到每个 id ], 使用:

for i in $(< id-file); do
    sed -n "/$i/,/<end>/p" parts-file
done

它将对 id-file 中的每个 ID 执行相同的操作(例如 a0002b0507c0576