0

我有一个循环,我正在对一个大文件进行增量修改。我不是每次都写入磁盘,而是使用命名管道。但是,这意味着循环的每次迭代都需要一个唯一的名称,因为我似乎无法将输出重定向回同一个命名管道。

$ mkfifo fifotemp
$ echo qwerty > fifotemp &
$ grep qwe <fifotemp >fifotemp &
$ cat <fifotemp
[hangs]

我可以为每次迭代创建一个新的命名管道,但这似乎不优雅。有没有更好的办法?

4

1 回答 1

1

您可能可以使用普通管道和递归函数。您需要将所有内容传递给递归函数,以确定何时退出以及在每个递归级别需要进行哪些处理。这个例子只是在每一层的每一行的前面添加递归层,并在第 4 层退出:

#!/bin/bash

doEdits() {
   while read -r line
   do
      echo "$1 $line"
   done
}

doRecursion() {
   level=$(($1 + 1))
   #echo "doRecursion $level" 1>&2
   if [ $level -lt 4 ]
   then
      doEdits $level | doRecursion $level
   else
      # Just output all the input
      cat
   fi
}

doRecursion 0 < myInputFile > myOutputFile

我假设递归级别的数量相当有限,否则您可能会遇到系统对打开进程和管道数量的限制。

这里的一个优点是每个管道应该只需要一个小的缓冲区。如果您的机器有多个处理器,这也可能很快。

于 2013-09-30T14:46:29.260 回答