2013-03-16 2 views
0

사용하려는 bash 스크립트에 문제가 있습니다. 1000s 파일이있는 디렉토리가 있고 각 파일을 사용하여 순차적으로 명령을 실행하고 싶습니다. 그러나 각 파일은 다른 파일 (예 : File1.sam, File1.gz, File2.sam, File2.gz 등)과 쌍을 이루고 있습니다. 실행중인 명령에는 쌍의 두 파일을 모두 인수로 사용해야합니다. 나는 아래의 명령과 비슷한 것을 사용하고 있는데, 단 하나의 인수 만 필요로했을 때 나는 (아래처럼) 단순히 확장 할 수 있다고 생각했다.프로그램을 순차적으로 실행하는 bash 스크립트

shopt -s nullglob 
for myfile1 in *.sam && for myfile2 in *.gz 
do 
./bwa samse -r "@RG\tID:$myfile1\tLB:$myfile1\tSM:$myfile1\tPL:ILLUMINA" lope_V1.2.fasta $myfile1 $myfile2 > $myfile1.sam2 2>$myfile1.log 
done 

누구든지이 문제를 어떻게 수정하고 나를 다른 방향으로 안내 할 수 있는지 알고 있습니까?

답변

1
shopt -s nullglob 
for myfile1 in *.sam 
do 
    myfile2=$(echo $myfile1|sed s/.sam$/.gz/) 
    ./bwa samse -r "@RG\tID:$myfile1\tLB:$myfile1\tSM:$myfile1\tPL:ILLUMINA" lope_V1.2.fasta $myfile1 $myfile2 > $saiFile.sam 2>$saiFile.log 
done 
1

확장명이 하나 인 파일 (예 : *.gz)에만 반복하고 sed를 사용하여 일치하는 .sam 파일을 가져옵니다. 이 같은

뭔가 :

for myfile1 in *.sam 
do 
    sam_name=`echo $myfile | sed -e s#gz\\$#sam#` 
    ./bwa samse -r "@RG\tID:$myfile1\tLB:$myfile1\tSM:$myfile1\tPL:ILLUMINA" lope_V1.2.fasta  $myfile1 $myfile2 > $saiFile.sam 2>$saiFile.log 
done 
2

왜 두 번째 파일 이름을 생성하지, 예를 들어,

for myfile1 in *.sam ; do 
    myfile2="${myfile1%.sam}.gz" 
    [ -e "$myfile2" ] || continue 
    ./bwa samse -r "@RG\tID:$myfile1\tLB:$myfile1\tSM:$myfile1\tPL:ILLUMINA" lope_V1.2.fasta "$myfile1" "$myfile2" > "$saiFile".sam 2>"$saiFile".log 
done 
+0

좋아 보인다. 개선을위한 제안은보다 엄격한 PE'myfile2 = "$ {myfile1 % .sam} .gz"'를 사용하는 것입니다. –

+0

@ JoshCartwright 감사합니다. 게시글을 업데이트했습니다. –

+0

오, 나는 당신이'./bwa' 행의 따옴표에서 $ myfile1 매개 변수 확장을 제거하지 않았 음을 알았습니다. 왜이 짓을 했나요? 파일 이름에 공백이 있으면 단어 분리로 인해 깨질 수 있습니다. –

0

파일 확장자 중 하나를 사용하여 for 루프를 변경하고 다른 파일 이름을 계산에 .gz로 .SAM를 교체합니다. 예를 들어 :

for p in a b c; do touch $p.1 $p.2; done 
for f in *.1; do g=${f%%.}.2; echo $f $g; done 

이 표시

a.1 a.2 
b.1 b.2 
c.1 c.2 
관련 문제