레이블이 SAS 일반인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SAS 일반인 게시물을 표시합니다. 모든 게시물 표시

2009년 10월 21일 수요일

불필요한 SAS work 라이브러리 삭제하기

SAS work 라이브러리는 쌔스 프로세스가 생성될 때 만들어져서 쌔스가 종료될 때 사라지는 임시 데이터 영역입니다. 그런데 프로세스가 비정상적인 상황에서 종료되어 미처 work라이브러리가 삭제되지 않는 경우가 있습니다.
오랜 시간 이 부분을 신경쓰지 않고 있다가 어느 날 문득 디스크 공간이 많이 줄어든 걸 알게 됩니다.

그럼 사용하지 않는 work디렉토리를 삭제해야겠지요.
sasv9.cfg 파일을 보면 다음과 같이 정의되어 있는 부분이 있습니다.

-work "directory명"


해당 디렉토리를 찾아보면, 다음과 같은 디렉토리들이 만들어져 있습니다.

SAS_workD81E0003B080_SAS3
SAS_work453A0001F0E2_SAS3
SAS_workE2EE0002C2FE_SAS3

바로 여기서 불필요한 디렉토리들을 삭제하면 됩니다.

그런데 현재 실행 중인 쌔스 프로세스가 있으면 어떤 것을 지워야 할 지 알기가 힘듭니다.
이런 경우 사용하기 위한 유틸리티가 있습니다.

바로 cleanwork라는 유틸리티 입니다.

사용법은 간단합니다.

cleanwork workdirectory명

이 명령을 사용하면 사용중인 work를 제외하고 나머지를 삭제할 수 있습니다.

가능한 한 사용자가 직접 지우는 것 보다 유틸리티를 사용하는 것이 안전상 좋습니다.

2009년 10월 13일 화요일

SAS에서 UNIX 명령어 실행 후 결과 받기

유닉스 SAS에서 디렉토리 내 화일 목록을 읽어오는 예 입니다.

filename oscmd pipe 'ls -l';

data dirlist;
   infile oscmd truncover;
   input mode $ 1-10 nlinks 12-14 user $ 16-23
         group $25-32 size 34-40 lastmod $ 42-53
         name $ 54-253;
run;

배치작업관리나 서버 모니터링 등에 응용하여 사용할 수 있습니다.

MONOTONIC 함수

다음과 같은 요구사항이 있을 경우 monotonic() 함수를 사용할 수 있습니다.

1) 추출한 데이터에 번호를 붙이고 싶다
2) 샘플로 10개만 추출하고 싶다

data step에서 _N_나, 오라클의 ROWNUM과 유사한 기능을 원할 때 사용할 수 있습니다.
물론 완전히 똑같이 사용할 순 없습니다만 상당히 유용한 경우가 있습니다.

[예제]
proc sql;
  select monotonic() as rowno
            , *  
  from   testdata
  where monotonic() le 10;
quit;
 
결과:
 
   rowno        id         y
-----------------------------
       1         1        66
       2         2        32
       3         3        10
       4         4        24
       5         5        50
       6         6        73
       7         7        40
       8         8        45
       9         9        88
      10        10        65

COLON (:) MODIFIER vs Truncated String Comparison Operators

특정 문자열이 '04'보다 작은 값으로 시작하는 경우 추출하는 예제입니다.
데이터 스텝에서와 proc sql에서 각가 다음과 같이 구현할 수 있습니다.


먼저 테스트용 데이터를 난수를 이용해서 생성합니다.

data testdata1;
    do id = 1 to 1000;
        x = ceil (ranuni(1) * 10000);
        charx = put (x, z4.);
        output;
    end;
run;


data step에서는 다음과 같이 구현됩니다.

/* Data Step : COLON (:) MODIFIER */
data result1;
    set testdata1;
    where charx lt :'04';
run;


동일한 결과를 Proc SQL에서 얻기 위한 샘플입니다.

/* Proc SQL : Truncated String Comparison Operators */
proc sql;
    create table result2
    as
    select *
    from testdata1
    where charx ltt '04';
quit;

Library 삭제하기

● 라이브러리 내용 모두 삭제하기
  ☞ proc datasets lib=work kill nolist memtype=all; quit;
      - work 대신에 지울 라이브러리 이름을 넣습니다


● 라이브러리 데이터셋만 삭제하기
  ☞ proc datasets lib=work kill nolist memtype=data; quit;


● 내용은 지우지 않고 라이브러리 정의만 삭제하기
  ☞ libname div_allo clear;