ls
、xargs
、およびbash -c
を組み合わせて、複数の入力ファイル(名前がパターンbarcode0[1-4].fastq
と一致する)で特定のプログラムを実行しています。
xargs
で呼び出しているプログラムは krocus と呼ばれ、以下は単一のプレースホルダー(複数の入力ファイル用)でプログラムを呼び出すために使用したコードです。
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
上記のコードでは、プレースホルダーはkrocusと呼びたいファイルです。つまりbarcode0[1-4].fastq
です。ここで、krocusの--kmer
引数に渡される2番目のプレースホルダーを追加します。この引数には、数値seq 12 14
、つまり12、13、および14を渡します。この例では、合計12個のファイルを作成します(つまり、3つの--kmer
値を組み合わせます。 4つの入力ファイルの場合)
以下は、このコードが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
の2つのコマンドの出力をパイプする必要があることです。
xargs
は2つのプレースホルダーをサポートしていません。
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
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}