Bash

xargs 與帶有多個佔位符的 bash -c 結合使用

  • September 29, 2019

我正在組合lsxargsbash -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

在上面的程式碼中,我的佔位符是我想在 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. 不要解析 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

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

引用自:https://unix.stackexchange.com/questions/543214