여러 입력 파일에서 특정 프로그램(이름이 패턴과 일치함 ) 을 결합 ls
하고 실행하고 있습니다 .xargs
bash -c
barcode0[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
. 이제 --kmer
krocus 매개변수 에 전달될 두 번째 자리 표시자를 추가하고 싶습니다 . 이 매개변수에는 숫자 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
문제는 두 명령의 출력을 파이프해야 한다는 것입니다 ls barcode0[1-4].fastq
.seq 12 14
답변1
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
답변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}