*This Q on Stackoverflow - http://stackoverflow.com/q/22643216/604456. *All this takes is a list of variables & prints the intersection of the lists and cardinality. *Does not count repeat symbols in the lists. *Uses strings in matrix - so variable names will be truncated to first 8 values. DEFINE !InterSet (!POSITIONAL = !CMDEND) OMS /SELECT ALL EXCEPT = [WARNINGS] /TAG = "NoCrap" /DESTINATION VIEWER = NO. DATASET COPY XTempX. DATASET ACTIVATE XTempX. !LET !Total = !NULL !DO !I !IN (!1) !LET !Total = !CONCAT(!Total," ") !LET !E = !I !DOEND !LET !Ln = !LENGTH(!Total) !LET !B = !HEAD(!1) MATCH FILES FILE = * /KEEP !1. VARSTOCASES /MAKE V FROM !B TO !E /INDEX OrigVar (V). SORT CASES BY V OrigVar. CASESTOVARS /ID = V /VIND ROOT = "D" /INDEX = OrigVar. !DO !I !IN (!1) RENAME VARIABLES (!CONCAT("D",!I) = !I). !DOEND *This has to be a set of symbols not contained in the. *Original variable name anywhere. !LET !pars = "0x_x0" !DO !I !IN (!1) !DO !J !IN (!1) COMPUTE !CONCAT(!I,!pars,!J) = !I*!J. !DOEND !DOEND COMPUTE Order = $casenum. DO REPEAT D = !CONCAT(!B,!pars,!B) TO !CONCAT(!E,!pars,!E). IF (Order<>1) D = LAG(D) + D. END REPEAT. SORT CASES BY Order (D). SELECT IF ($casenum = 1). FLIP VARIABLES = !CONCAT(!B,!pars,!B) TO !CONCAT(!E,!pars,!E). COMPUTE CASE_LBL = CHAR.SUBSTR(CASE_LBL,CHAR.INDEX(CASE_LBL,!QUOTE(!pars))+!LENGTH(!pars)). OMSEND TAG = "nocrap". MATRIX. GET I /FILE = * /VARIABLE = var001. GET V /FILE = * /VARIABLE = CASE_LBL. COMPUTE I2 = RESHAPE(I,!Ln,!Ln). COMPUTE V2 = V(1:!Ln). PRINT I2 /TITLE = "Intersection of Lists" /RNAMES =V2 /CNAMES = V2. COMPUTE V3 = {"Var";V2}. SAVE {V2,I2} /OUTFILE = * /NAMES V3 /STRINGS Var. END MATRIX. DATASET NAME InterSet. FORMATS !B TO !E (F3.0). DATASET CLOSE XTempX. !ENDDEFINE. *Example use. * DATASET CLOSE ALL. * OUTPUT CLOSE ALL. * DATA LIST FREE / x_1 (A1) y_1 (A5) z_1 (A8). * BEGIN DATA * b # g # i # * l + k "" "" m "" END DATA. * DATASET NAME Test. *InterSet x_1 y_1 z_1 .