【发布时间】:2012-03-30 03:02:49
【问题描述】:
我有一个可以以两种方式运行的程序:单端或双端模式。语法如下:
program <output-directory-name> <input1> [input2]
需要输出目录和至少一个输入。如果我想在三个文件上运行它,比如样本 A、B 和 C,我会使用 find with xargs 或 parallel 之类的东西:
user@host:~/single$ ls
sampleA.txt sampleB.txt sampleC.txt
user@host:~/single$ find . -name "sample*" | xargs -i echo program {}-out {}
program ./sampleA.txt-out ./sampleA.txt
program ./sampleB.txt-out ./sampleB.txt
program ./sampleC.txt-out ./sampleC.txt
user@host:~/single$ find . -name "sample*" | parallel --dry-run program {}-out {}
program ./sampleA.txt-out ./sampleA.txt
program ./sampleB.txt-out ./sampleB.txt
program ./sampleC.txt-out ./sampleC.txt
但是当我想在“paired-end”模式下运行程序时,我需要给它两个输入。这些是相关文件,但不能简单地将它们连接起来——您必须将两者都作为输入来运行程序。文件命名合理,例如 sampleA_1.txt 和 sampleA_2.txt。
我希望能够在命令行上使用 xargs(或最好是并行)之类的东西轻松创建它:
user@host:~/paired$ ls
sampleA_1.txt sampleB_1.txt sampleC_1.txt
sampleA_2.txt sampleB_2.txt sampleC_2.txt
user@host:~/paired$ find . -name "sample*_1.txt" | sed/awk? | parallel ?
program ./sampleA-out ./sampleA_1.txt ./sampleA_2.txt
program ./sampleB-out ./sampleB_1.txt ./sampleB_2.txt
program ./sampleC-out ./sampleC_1.txt ./sampleC_2.txt
理想情况下,该命令会删除 _1.txt 以创建输出目录名称(sampleA-out 等),但我确实需要能够接受该参数并将 _1 更改为 _2 以用于第二个输入.
我知道这对脚本来说非常简单——我在 Perl 中使用快速正则表达式替换来完成此操作。但我希望能够用一个快速的单线来做到这一点。
提前致谢。
【问题讨论】:
标签: bash sed awk parallel-processing xargs