2014-09-14 2 views
0

여기 내 딜레마입니다. 나는 형태로 명령이 있습니다두 개의 파일이있는 명령, 하나의 파일이 반복 됨

grdpaste infile.grd infile.grd -Goutfile.grd 

나는 각각 infile.grd라는 이름의 파일이 들어있는 같은 디렉토리에 일련의 폴더가 있습니다. 첫 번째 실행에서 첫 번째 및 두 번째 폴더의 infile.grd을 결합한 다음 두 번째 폴더는 첫 번째 실행에서 outfile.grd과 세 번째 폴더에서 infile.grd을 결합하는 식으로 모든 폴더를 반복합니다. 얼마나 많은 폴더가 있는지 모릅니다. 최종 제품에는 모든 infiles의 조합이 포함되어야합니다.

나는 (내가 이전에 내 스크립트에서했던 것처럼) 조합 부분을 제어하기 위해 카운터를 사용할 수 있다고 생각 하나, 하나의 폴더에서 하나의 파일을 가져오고 다른 파일에서 하나의 파일을 가져 오는 방법을 모른다. 다음 폴더, 폴더의 이름을 알지 못합니다. 나는 이것이 의미가 있기를 바랍니다, 많이 감사합니다. grdpaste 다음 제정신이 방법으로 빈 입력 파일을 받아 들일 경우

오전

+0

마지막 'outfile.grd'는 단순히 모든 infile.grd의 조합입니다. 빈'outfile.grd'로 시작하여 모든 'infile.grd'와 병합하면 더 쉽지 않을까요? 이를 염두에두고'for-loop'는'forile in */infile.grd'처럼 간단합니다. 디렉토리 구조가 평평하지 않으면'find. -name infile.grd'가 더 나은 선택입니다. – alvits

답변

0

다음과 같은 작업을해야합니다 :

lastfile=dummy.grd 
touch "$lastfile" 
for infile in */infile.grd; do 
    _outfile=outfile$((i++)).grd 
    grdpaste "$lastfile" "$infile" -G"$_outfile" 
    lastfile=$_outfile 
done 

그 다음 위의 루프가를 저장하기 위해 수정해야 할 수없는 경우 이름은이 $lastfile에보고를 통해 ...이 같은 아무것도에게 첫 번째 루프를하지 않는다 : 아래 게시

lastfile= 
for infile in */infile.grd; do 
    [ -z "$lastfile" ] && { lastfile=$infile; continue; } 
    _outfile=outfile$((i++)).grd 
    grdpaste "$lastfile" "$infile" -G"$_outfile" 
    lastfile=$_outfile 
done 
+0

안녕하세요 이튼, 실제로 방금 tmp 파일에 쓰고 그 다음 카운터로 읽는 방법으로 해결책을 찾았습니다. 일단 디버깅되면 게시 할 것입니다. – amoodie

+0

@amoodie'grdpaste'가 입력과 출력으로 잘 작동하고 입력과 출력 모두에 대해 동일한 파일을 의미있는 방식으로 올바르게 사용할 수 있으면 대답을 크게 단순화 할 수 있습니다. 나는 그것이 가능할 수 있는지를 몰랐고, 그렇게 믿을 수 없었고, 더 복잡한 해결책을 써야했습니다. –

+0

grdpaste 잘 작동하지 않습니다, 그래서 꽤 더러운 메서드를 수행 할 수 있지만 일한 것으로 보인다. 감사. – amoodie

0

솔루션입니다. 전체 코드는 moravi project here을 참조하십시오.

for folder in */ 
    do 
    ls "$folder" | sed 's/e/e/' >"${folder%/}.tmp" 
done 
for file in *.tmp 
    do 
    lat=$(echo $file | awk -F "." '{print $1}') 
    count=0  
    while read line 
     do 
     count=$(($count + 1)) 
     if [ "$count" = "1" ] 
      then 
      declare "tmp_${count}=$line" 
     elif [ "$count" = "2" ] 
      then 
      declare "tmp_${count}=$line" 
      prod="P"$((${count} - 1))".grd" 
      grdpaste ./${lat}/${tmp_1} ./${lat}/${tmp_2} -G./${lat}/${prod} -V 
     elif [ "$count" > "2" ] 
      then 
      r="tmp_"${count} 
      declare "r=$line" 
      pprod="P"$((${count} - 2))".grd" 
      prod="P"$((${count} - 1))".grd" 
      grdpaste ./${lat}/${r} ./${lat}/${pprod} -G./${lat}/${prod} -V 
      to_paste=${prod} 
     fi 
    done <$file 
done 
rm *.tmp 
관련 문제