複数のプレースホルダを持つbash -cと組み合わせたxargs

複数のプレースホルダを持つbash -cと組み合わせたxargs

複数の入力ファイルで特定のプログラム(名前がパターンと一致する)を組み合わせてls実行しています。xargsbash -cbarcode0[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パラメータに渡される2番目のプレースホルダを追加したいと思います。このパラメータには数値seq 12 14(例:12、13、14)を渡したいと思います。この場合、合計12個のファイルを生成しようとします(つまり--kmer、4つの入力ファイルから3つの値を結合したいという意味です)。

パラメータプレースホルダを持つコードは次のとおりです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

問題は、2つのコマンドの出力をパイプする必要があることですls barcode0[1-4].fastqseq 12 14

答え1

  1. lsを解析しないでください

  2. xargs2 つのプレースホルダーはサポートされません。

  3. forループを使用してください。実際には2つのループがあります(1つはファイル名用、もう1つは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}

関連情報