2012-04-05 5 views
1

시간별로 수집 한 데이터 파일이 있습니다. 나는 매일 매시간 파일을 집계해야대상 파일과 소스 파일의 확장자가 같은 Makefile을 작성하는 방법은 무엇입니까?

20120101-00.raw 
20120101-01.raw 
... 
YYYYMMDD-HH.raw 

다음되는 등 집계 스크립트의 구문 월에 매일 : 집계의

aggregate output-file input-file1 input-file2 ... 

스키마는 다음과 같습니다

20120101-[0-2][0-9].raw -> 20120101.raw 
201201[0-3][0-9].raw -> 201201.raw 
etc. 
처럼 그들은 보이는 파일 이름

프로세스를 자동화하기 위해 Makefile을 작성하려하지만 완전히 고정되어 있습니다. 확장 기능 문제를 처리하는 방법을 모릅니다. 소스 및 대상 파일의 확장자는 동일합니다. 나는 다음을 사용합니다 :

$(shell find . -type f | grep -e "\.raw1$$" | cut -c 8 | sort -u) 

생성해야하는 파일을 찾으십시오.

+5

만들기합니다 ... 습득 조건 - 패턴 이후 –

답변

0

필자는 Oli Charlesworth와 Make가이 작업에 가장 적합한 도구가 아니라는 것에 동의합니다. Perl 스크립트를 사용합니다. 그러나 당신이 Make를 사용하고 싶다면, 그것을 할 수 있습니다. sed에 대한 호출을 사용하는 너무 끔찍한 해킹이 있습니다. 약간 조이면되지만 가독성을 높이기 위해 가고 있습니다.

FILES := $(shell ls *-??.raw) 

DAYS := $(sort $(shell ls *-??.raw | sed 's/\(........\).*/\1.raw/')) 
MONTHS := $(sort $(shell ls *-??.raw | sed 's/\(......\).*/\1.raw/')) 
YEARS := $(sort $(shell ls *-??.raw | sed 's/\(....\).*/\1.raw/')) 

all.raw: $(YEARS) 
    aggregate [email protected] $^ 

$(YEARS): %.raw : $(MONTHS) 
    aggregate [email protected] $(filter $*%, $^) 

$(MONTHS): %.raw : $(DAYS) 
    aggregate [email protected] $(filter $*%, $^) 

$(DAYS): %.raw : 
    aggregate [email protected] $(filter $*%, $(FILES)) 
+0

는, 각 대상에 대해 동일이 문제를 해결하기 위해 이상적인 도구 같은 소리하지 않는 모든 출력 파일은 make가 될 때마다 다시 집계되지 않습니다 운영. 또한 집계 된 파일 이름이 이미있는 디렉터리에서 실행하면 의도하지 않은 결과가 발생합니다. 예를 들어'201201.raw'는'DAYS' 변수에서'201201.r.raw'가됩니다. –

+0

@BrianSwift : 첫 번째 요점은 이해할 수 없지만 두 번째 것은 유효합니다. 'ls'에 대한 호출을 수정합니다. – Beta

+0

첫 번째 지점을 철회합니다. 그러나 다른 문제는 make가 완료된 후 시간별 파일이 업데이트되거나 같은 시간 동안 새로운 시간별 파일이 추가되면 출력 파일을 다시 빌드하지 않는다는 것입니다. –

1

이 스크립트를 작성하면 .raw 파일 이름 목록을 읽을 수 있고 목록을 정렬 할 수 있습니다. 각 파일 이름은 마지막 두 자리를 삭제하여 축약 된 이름을 만듭니다. 단축 이름은 이전 단축과 동일합니다 이름, 축약 된 이름이 이전의 축약 된 이름과 다른 경우 집계 할 목록에 전체 파일 이름을 추가하십시오. 출력 파일이 이미 존재하며 다음보다 새로운 경우 목록에 추가 된 마지막 항목을 기반으로 출력 파일 이름을 작성하십시오 목록에 추가 된 마지막 항목은 이미 최신 상태이므로 아무 작업도 수행하지 않으며, 그렇지 않으면 출력 파일 이름과 입력 파일 목록을 사용하여 집계 명령을 실행합니다.

는 모든 매일 파일을 다시 실행, 모든 시간마다 파일을 실행 먼저 스크립트를 사용하여 (원하는 경우 연간 파일을 생성하는 모든 월별 파일을 다시 실행할 수 있습니다.)

개설 된 스크립트에 대한 몇 가지 제약 조건이 있습니다

  1. 그것은 한 번에에 (예를 들어, 시간별, 일별) 각 그룹의
  2. 모든 파일을 집계 할 필요가 파일의 한 유형의 목록을 제공해야 같은 디렉토리에 있거나 초기 정렬은 filena의 basename (디렉토리가 아님) 부분 만 사용해야합니다. 나를 분류 키로.
  3. 스크립트가 실행되는 동안 업데이트 될 수있는 로그 파일 인 경우 집계 명령이 실행되는 동안 기록되는 데이터가 누락 될 수 있습니다. 이는 출력 파일의 시간 소인 (입력 파일과 관련하여 최신 파일인지 여부를 판별하는 데 사용됨)이 시작될 때가 아니라 집계 완료 시간이되기 때문입니다. 해결 방법은 집계를 시작하기 전에 타임 스탬프 파일 (출력 파일 이름을 기반으로 함)을 터치하고 출력 파일 대신 타임 스탬프 파일을 사용하여 출력 파일이 최신 버전인지 확인하는 것입니다.
관련 문제