SAS命令行 - 部分程序执行

时间:2015-10-02 14:41:34

标签: unix command-line sas batch-processing

我正在使用runSASJob在UNIX环境中执行SAS程序。

我想知道是否有办法从命令行执行SAS程序的一部分。

例如,假设我有一个包含100行的SAS程序,该程序中有一个数据步骤占用5-10行。

我是否可以仅从命令行运行第5-10行?

由于

2 个答案:

答案 0 :(得分:1)

您可以使用各种选项:

  1. 将5条感兴趣的行拆分为单独的文件,然后将其替换为原始100行程序中的%include语句
  2. 如上所述,但使用自动调用宏或存储已编译的宏
  3. 编写一个数据步骤,将100行.sas文件作为输入,仅输出您想要的5行,%包含它 - 如果您对要运行的文件没有写入权限,则非常有用来自的5行,您不想保留单独的副本。
  4. 如果您已在同一会话中执行了整个100行程序,则设置option spool,并且您知道日志中占用5条所需行的行号,您可以通过{重播这些行{1}}陈述。
  5. 对于选项3,示例数据步骤可能如下所示:

    %include

    如果你感到勇敢,并且你真的不想创建一个额外的临时文件,你可以使用call execute代替这样做:

    %let SHORTFILE = %sysfunc(pathname(work))/shortfile.sas;
    
    data _null_;
      infile "/path/to/100/line/file.sas" obs = 10 firstobs=5 lrecl = 32767;
      file "&SHORTFILE" lrecl= 32767;
      input;
      put _infile_;
    run;
    
    %include "&SHORTFILE";
    

答案 1 :(得分:0)

以下宏应解决此问题以及一些类似问题:

%macro runMacroFromEnv
/des='Set the environment value RUNMACRO to run a macro'; 
    %if %sysfunc( envlen( RUNMACRO ) ) > 0 %then %sysget( RUNMACRO );
%mend;

例如:如果您有以下文件:

%macro foo;
   %put I just ran foo;
%mend;

%macro runMacroFromEnv
/des='Set the environment value RUNMACRO to run a macro'; 
    %if %sysfunc( envlen( RUNMACRO ) ) > 0 %then %sysget( RUNMACRO );
%mend;

%runMacroFromEnv;

并使用以下命令调用SAS:

sas runMacro.sas -set RUNMACRO %foo

然后在日志的某个地方,你会看到:

I just ran foo

一些重要的细节:

  • 在Unix和Windows中使用-set(至少)
  • 还有其他设置环境变量的机制,具体取决于您的shell
  • 忘记%
  • 中的-set RUNMACRO %foo
  • 有关详细信息,请参阅The set system option