web-dev-qa-db-ja.com

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

lsxargs、および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].fastqseq 12 14の2つのコマンドの出力をパイプする必要があることです。

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

  2. xargsは2つのプレースホルダーをサポートしていません。

  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
4
cas

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}
0
Ole Tange