여러 자리 표시자가 있는 bash -c와 결합된 xargs

여러 자리 표시자가 있는 bash -c와 결합된 xargs

여러 입력 파일에서 특정 프로그램(이름이 패턴과 일치함 ) 을 결합 ls하고 실행하고 있습니다 .xargsbash -cbarcode0[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. 이제 --kmerkrocus 매개변수 에 전달될 두 번째 자리 표시자를 추가하고 싶습니다 . 이 매개변수에는 숫자 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

  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

답변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}

관련 정보