Bash 在管道输出中添加间歇ID

Bash 在管道输出中添加间歇ID,bash,scripting,Bash,Scripting,我希望遍历文档文件列表,处理它们并在单个文件中输出结果,但要使用指定的文件ID。 处理包括:标记移除、标记化、句子分割 输入如下: /path/to/file1 docid1 /path/to/file2 docid2 输出将是标记,每行一个,标记包含docid和句子nr: <D=docid1.1> tok1 tok2 </D> <D=docid1.2> ... </D> <D=docid2.1> ... </D> 现

我希望遍历文档文件列表,处理它们并在单个文件中输出结果,但要使用指定的文件ID。 处理包括:标记移除、标记化、句子分割

输入如下:

/path/to/file1 docid1 
/path/to/file2 docid2
输出将是标记,每行一个,标记包含docid和句子nr:

<D=docid1.1>
tok1
tok2
</D>
<D=docid1.2>
...
</D>
<D=docid2.1>
...
</D>
现在的问题是,我有相当多的小文件,每个步骤都有一些启动时间(启动JVM、加载模型等),有些相当长。实际运行时间非常快,就像非常大的(人工)文件一样。 分析表明,这一步(标记化和句子拆分)是我项目中最耗时的一步(其他一些概念上更“复杂”的东西运行得更快)

基本上,我想做的是为strip_markup.sh脚本提供整个文件列表,而不是单个文件名,但之后需要以某种方式插入ID。如果不是绝对必要,则不应更改输入和输出格式。 此外,我们还希望使用现有的模块进行标记化和拆分,因为大量数据已经以这种方式进行了处理


有什么办法吗?

我可以假设
add_id.sh
只需在
行前面加上一行
就可以了吗?也许下面的方法会奏效。注意,我使用
while
循环和
read
命令来提取文件名和docid,而不需要外部进程

< $filelist
while read filename docid; do
    echo "<D=$docid>"
    strip_markup.sh $filename |
    tokenize.sh |
    sentence_split.sh
    echo "</D>" 
done > $outfile
<$filelist
读取文件名docid时;做
回声“”
strip_markup.sh$filename|
tokenize.sh|
句子_split.sh
回声“”
完成>$outfile

由于循环体中的所有标准输出都被一次序列化到输出文件中,因此不需要一个单独的进程将标记化和拆分的数据作为输入,以便将其包装到
中。我是否可以假设
add_id.sh
只是在
行之前加上一行
行作为输入?也许下面的方法会奏效。注意,我使用
while
循环和
read
命令来提取文件名和docid,而不需要外部进程

< $filelist
while read filename docid; do
    echo "<D=$docid>"
    strip_markup.sh $filename |
    tokenize.sh |
    sentence_split.sh
    echo "</D>" 
done > $outfile
<$filelist
读取文件名docid时;做
回声“”
strip_markup.sh$filename|
tokenize.sh|
句子_split.sh
回声“”
完成>$outfile

由于循环体中的所有标准输出一次序列化到输出文件,因此不需要单独的进程将标记化和拆分的数据作为输入,以便将其包装在
中。add_ids.sh还打印句子编号。无论如何,我认为您的解决方案仍然存在原则性问题。在这种情况下,
如何添加id.sh
句子分割.sh
中获取句子编号?在您发布的代码中不可见的脚本之间共享的全局状态。我建议您发布所有脚本的内容,但我认为这个问题超出了stackoverflow的范围,可能应该转移到codereview.stackexchange.com。add_ids.sh也会打印句子编号。无论如何,我认为您的解决方案仍然存在原则性问题。在这种情况下,
如何添加id.sh
句子分割.sh
中获取句子编号?在您发布的代码中不可见的脚本之间共享的全局状态。我建议发布您所有脚本的内容,但我认为这个问题超出了stackoverflow的范围,可能应该转移到codereview.stackexchange.com。