Desktop productivity for business analysts and programmers

Connecting to UNIX in a macro with "x" command

Reply
Occasional Contributor
Posts: 14

Connecting to UNIX in a macro with "x" command

Hi,

 

I am trying to Unzip some files in a location connected to UNIX.

However there are several to Unzip and I thought it will be easier to code using a macro.

 

But I am not sure how to alter the "x" command or use the following statement in the macro

 

x "gunzip /sas/data/...."

 

Would anyone have any ideas of how to implement this code in the macro.

 

Thanks.

Grand Advisor
Posts: 17,428

Re: Connecting to UNIX in a macro with "x" command

EG typically doesn't allow for X commands unless you've overridden the default settings. 

 

Whats the parameter for your macro? The filenames? Or will you automatically scan a folder for zip files and unzip them all? 

 

Before writing a macro first get base code working. Then determine your parameters, and then convert. 

Esteemed Advisor
Posts: 6,702

Re: Connecting to UNIX in a macro with "x" command

First of all, gunzip accepts a list of files on the commandline. Therefore you can use wildcard characters to name a group or groups of files.

 

Second, you need to have the XCMD system option enabled at startup; there is an option for that in the metadata of workspace servers. You cannot change this option during SAS runtime.

 

Third, you can run your gunzip command repeatedly from a dataset containing filenames with call system(). No need for a macro, unless you want to automate that (parameterized filename patterns, directories).

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Valued Guide
Posts: 505

Re: Connecting to UNIX in a macro with "x" command

If you have IML Studio then you should have a bridge to R you can then do the following

    library(R.utils);                                                                                                                                                 
    wd<-getwd();                                                                                                                                                      
    setwd("c:\\temp");                                                                                                                                                
    gunzip("class.sas7bdat.gz",remove=FALSE,overwrite=TRUE);                                                                                                          
    setwd(wd);    

Note gunzip removes the gz file and creates c:/temp/class.sas7bdat         
Super User
Super User
Posts: 6,373

Re: Connecting to UNIX in a macro with "x" command

You can call the X command in a macro the same way you would call it outside of a macro.

%macro gunzip(filename);
x "gunzip &filename" ;
%mend gunzip;

But I find it is usually better to use a pipe to run commands since you can then capture any responses the command might make.

%macro gunzip(filename);
data _null_;
  infile "gunzip &filename" pipe;
  input;
  put _infile_;
run;
%mend gunzip;
Valued Guide
Posts: 505

Re: Connecting to UNIX in a macro with "x" command

Curious if the IML bridge to R works with NOXCMD
Respected Advisor
Posts: 3,840

Re: Connecting to UNIX in a macro with "x" command

Have you considered using the Filename ZIP engine? Here how this could work: 

http://blogs.sas.com/content/sasdummy/2015/05/11/using-filename-zip-to-unzip-and-read-data-files-in-...

Ask a Question
Discussion stats
  • 6 replies
  • 312 views
  • 0 likes
  • 6 in conversation