使用gnu并行运行bash脚本
我的脚本在读取时使用使用gnu并行运行bash脚本,bash,parallel-processing,gnu-parallel,Bash,Parallel Processing,Gnu Parallel,我的脚本在读取时使用逐行处理一些文件 当我这样做时: head -n5 file1 | ./myscript.sh 我的成绩很好 但是尝试使用gnuparallel将其并行化: head -n5 file1 | parallel -j 4 ./myscript.sh 产生结果文件为空 我也尝试过: parallel -j 4 -a file1 ./myscript.sh 但还是不行。我试着去做和他们在电影里说的相似的事情 文档,但没有任何成功。 我做错了什么 编辑: 也许这会有帮助: he
逐行处理一些文件
当我这样做时:
head -n5 file1 | ./myscript.sh
我的成绩很好
但是尝试使用gnuparallel
将其并行化:
head -n5 file1 | parallel -j 4 ./myscript.sh
产生结果
文件为空
我也尝试过:
parallel -j 4 -a file1 ./myscript.sh
但还是不行。我试着去做和他们在电影里说的相似的事情
文档,但没有任何成功。
我做错了什么
编辑:
也许这会有帮助:
head -n5 file1 | parallel -a - -j 4 echo #this works
head -n5 file1 | parallel -a - -j 4 ./myscript #this doesn't
parallel
不会将输入行发送到给定命令的stdin
,而是将该行附加到您给定的命令
如果您像以前那样编写它,那么您实际上是在调用/myscript.sh
,您想在那里调用/myscript.sh
,并将输入作为stdin
发送
这应该起作用:
head -n5 file1 | parallel -j 4 "echo {} | ./myscript.sh"
{}
向并行
指示您希望输入的位置,而不是末尾的默认值。--pipe是为您制作的:
cat file1 | parallel --pipe -N5 ./myscript.sh
但是您需要更改myscript.sh
,这样它就不会保存到result
,而是将输出打印到stdout。然后你可以:
cat file1 | parallel --pipe -N5 ./myscript.sh > result
并避免任何混合。如果脚本正在写入结果文件,则每次都可能会覆盖它。您需要将其附加到文件中parallel
将为每个输入行创建脚本的新实例。关于追加,您是对的,但现在我的文件中的计数器对于行中的每个增量都保持为1,因为所有这些独立进程:),无论如何,您能解释一下我上面编辑的情况吗?我不知道您指的是什么计数器;剧本是做什么的echo
输出
,因此第一个示例应将每行打印到stdout
。您的脚本需要在stdin
上发送输入,而不是作为参数发送。现在parallel正在工作,但我得到了重复和错误的结果,因为在我的脚本中,我正在通过grep
将一个文件中的单词匹配到另一个大文件上,它不是应该在每个进程中将文件分割成块,这样它们就不会混合在一起吗?脚本的每个实例将只给出一行作为输入。我真的不明白你想用这个脚本做什么。你能把它寄出去吗?