xargs 与带有多个占位符的 bash -c 相结合

xargs 与带有多个占位符的 bash -c 相结合

我正在组合ls,xargsbash -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。我现在想添加第二个占位符,它将传递给--kmerkrocus 的参数。对于这个参数,我想传递数字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].fastqseq 12 14

答案1

  1. 不要解析 ls

  2. xargs不支持两个占位符。

  3. 使用 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}

相关内容