linux命令行并行 linuxshell并行执行

Linux Parallel 简单用法parallel是一个Linux命令行并行工具(mac也可以用)
这里只说一种简单的用法,基本上能满足日常工作需求,
假设当前目录有三个 *.txt 文件,我们使用gzip对着三个文件进行压缩
1.顺序执行语句:
2.parallel并行版本
3.读取命令版本
Linux diff 命令 比较两个文件不看空格,并行打印 的命令的确会有这个问题,但尝试linux命令行并行了好一阵后发现,实际上也不是问题 。
要解决此问题,加个选项--suppress-common-lines即可 。
diff -wy --suppress-common-lines a.txt b.txt
或者:
sdiff -W --suppress-common-lines a.txt b.txt
为什么说不是问题呢linux命令行并行?看看下图这个例子(a.txt中包含TAB和空格,b.txt里包含空格) 。
得出的结论就是:
加了-y选项后 , 无论行内容是否相同都会打印 。但注意看一下,行内容不相同的情况,两端打印时中间会有一个竖线分隔 。
加了-w选项后,比较结果其实是完全相同的,不存在有竖线分隔的两端打印,从diff命令返回值(通过$?取得)也可以看出 。
所以,想到用--suppress-common-lines选项抑制相同行的输出 。
linux怎么用一步命令实现多个脚本并行执行?(run1.sh ) ; (run2.sh ) ; (run3.sh)
如果还有继续加
Linux下的并行神器——parallelGNU Parallel的输入源支持文件、命令行和标准输入(stdin或pipe) 。
当然,若不想像上面那样进行组合,可使用 --xapply 参数从每一个源获取一个参数(或文件一行),这个参数有些类似R中的函数,具有广播作用——如果其中一个输入源的长度比较短,它的值会被重复 。
GNU Parallel可以通过 --arg-sep 和 --arg-file-sep 指定分隔符替代 ::: 或 ::::,当这两个符号被其它命令占用的时候会特别有用 。
GNU Parallel默认把一行做为一个参数:使用 \n 做为参数定界符 。可以使用 -d 改变:
GNU Parallel支持通过 -E 参数指定一个值做为结束标志:
GNU Parallel使用--no-run-if-empty来跳过空行:
如果parallel之后没有给定命令,那么这些参数会被当做命令:
此外,命令还可以是一个脚本文件,一个二进制可执行文件或一个bash的函数(须用 export -f 导出函数)
GNU Parallel支持多种替换字符串 , 默认使用 {},使用 -I 改变替换字符串符号 {} 。其最常见的字符串替换包括以下几种: {.}  , 去掉扩展名; {/} ,去掉路径,只保留文件名; {//},只保留路径; {/.}  , 同时去掉路径和扩展名; {#}  , 输出任务编号 。同时对于每一个字符串替换都可以自己指定符号: -I 对应 {} ; --extensionreplace 替换{.} ; --basenamereplace 替换{/} ; --dirnamereplace 替换 {//} ; --basenameextensionreplace 替换{/.} ; --seqreplace 替换{#}。
同时,如果有多个输入源时,可以通过 {编号} 指定某一个输入源的参数:
使用--header把每一行输入中的第一个值做为参数名 。
使用 --colsep 把文件中的行切分为列 , 做为输入参数 。
--xargs 会在一行中输入尽可能多的参数(与参数字符串长度有关),通过 -s 可指定一行中参数的上限 。
为了获得更好的并发性 , GNU Parallel会在文件读取结束后再分发参数 。
GNU Parallel 在读取完最后一个参数之后,才开始第二个任务 , 此时会把所有的参数平均分配到4个任务(如果指定了4个任务) 。
第一个任务与上面使用--xargs的例子一样,但是第二个任务会被平均的分成4个任务 , 最终一共5个任务 。(奇怪的是我的结果与教程的结果不一样)

推荐阅读