在STDIN上给出以下示例输入:
foo
bar bar
baz
===
qux
bla
===
def
zzz yyy
是否可以将它拆分为分隔符(在本例中为'===')并通过stdin将其提供给并行运行的命令?
因此上面的示例输入将导致3个并行进程(例如名为do.sh的命令),其中每个实例都接收到STDIN上的部分数据,如下所示:
do.sh(实例1)通过STDIN接收:
foo
bar bar
baz
do.sh(实例2)通过STDIN接收:
qux
bla
do.sh(实例3)通过STDIN接收此内容:
def
zzz yyy
我认为使用xargs或GNU parallel可以做到这样的事情,但我不知道如何。
答案 0 :(得分:11)
GNU Parallel可以从版本20110205开始。
cat | parallel --pipe --recend '===\n' --rrs do_stuff
答案 1 :(得分:2)
一般来说,没有。这种评估的原因之一是从文件而不是终端读取标准I / O读取数据块 - 一次BUFSIZ字节,其中BUFSIZ通常是2的幂,如512或更大。如果数据在文件中,则一个进程将读取显示的整个文件 - 如果它们共享相同的打开文件描述,则其他进程将看不到任何内容(类似于文件描述符,但是多个文件描述符可以共享相同的打开文件描述,以及可以在不同的进程中),或者如果它们不共享相同的打开文件描述,则会读取整个相同的文件。
因此,您需要一个进程来读取知道它需要将信息分发到三个进程的文件 - 并且它需要知道如何连接到这三个进程。可能是您的分发程序运行三个进程并写入其单独的管道输入。或者可能是分发服务器连接到三个套接字并写入不同的套接字。
您的示例未显示/描述如果标记分隔了37个部分会发生什么。
我有一个名为tpipe
的家庭酿造程序,就像Unix tee
命令一样,但是它会将(所有)标准输入的副本写入每个进程,并写入标准默认输出也是如此。这可能是您需要的合适基础(至少涵盖了它的过程管理部分)。如果您需要副本,请与我联系 - 请参阅我的个人资料。
如果您使用Bash,则可以使用常规tee
进行流程替换来模拟tpipe
。有关如何使用的说明,请参阅此article。
另请参阅SF 96245了解相同信息的其他版本 - 以及指向pee
的程序的链接,该程序与tpipe
非常相似(相同的基本构思,各种执行略有不同)方面)。
答案 2 :(得分:1)
您可以使用named pipes执行此操作。命名管道允许您将标准管道视为文件。您可以拥有多个命名管道,并让其他程序处理它们。
我对命名管道并不熟悉,但我在这种情况下不时使用它们。