我正在组合ls
,xargs
并bash -c
在多个输入文件上运行特定程序(其名称与模式匹配barcode0[1-4].fastq
。
我正在调用的程序xargs
称为克罗库斯下面是我用来使用单个占位符调用程序的代码(对于多个输入文件):
ls barcode0[1-4].fastq |cut -d '.' -f 1|xargs -I {} bash -c "krocus --verbose --output_file out_krocus/{}_Ecoli1.txt /nexusb/Gridion/MLST_krocus_DBs/e_coli1 {}.fastq
在上面的代码中,我的占位符是我想在 ie 上调用 krocus 的文件barcode0[1-4].fastq
。我现在想添加第二个占位符,它将传递给--kmer
krocus 的参数。对于这个参数,我想传递数字seq 12 14
,即 12、13 和 14。在本例中,我想创建总共 12 个文件(这意味着我想组合--kmer
四个输入文件的三个值)
下面是我想象的带有参数占位符的代码的样子kmer
:
ls barcode0[1-4].fastq |cut -d '.' -f 1|xargs -I {} bash -c "krocus --verbose --output_file out_krocus/{placeholderForInputFile}_{placeholderForKmerSize}Ecoli1.txt /nexusb/Gridion/MLST_krocus_DBs/e_coli1 --kmer {placeholderForKmerSize} {placeholderForInputFile}.fastq
问题是我需要通过管道传输两个命令的输出,即ls barcode0[1-4].fastq
和seq 12 14
答案1
xargs
不支持两个占位符。使用 for 循环。实际上,有两个循环(一个用于文件名,另一个用于 12..14 序列)。
例如:
#!/bin/bash
for f in barcode0[1-4].fastq; do
bn="$(basename "$f" .fastq)"
for k in {12..14}; do
krocus --verbose --output_file "out_krocus/${bn}_${k}Ecoli1.txt" \
/nexusb/Gridion/MLST_krocus_DBs/e_coli1 --kmer "$k" "$f"
done
done
答案2
使用 GNU Parallel 看起来像这样:
parallel krocus --verbose --output_file out_krocus/{1.}_{2}Ecoli1.txt /nexusb/Gridion/MLST_krocus_DBs/e_coli1 --kmer {2} {1} ::: barcode0[1-4].fastq ::: {12..14}