Bash
xargs 與帶有多個佔位符的 bash -c 結合使用
我正在組合
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
在上面的程式碼中,我的佔位符是我想在 ie 上呼叫 krocus 的文件
barcode0[1-4].fastq
。我現在想添加第二個佔位符,它將傳遞給--kmer
krocus 的參數。對於這個參數,我想傳遞數字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].fastq
和seq 12 14
- 不要解析 ls
xargs
不支持兩個佔位符。- 使用 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}