MVSFORUMS.com A Community of and for MVS Professionals
View previous topic :: View next topic
Author
Message
issac1029 Intermediate Joined: 10 Dec 2005 Posts: 159 Topics: 75
Posted: Sat Apr 22, 2006 5:43 am Post subject: Cartesian Join match using DFSORT Splice
1) Code:
1 22222
2 33333
2 44444
2 55555
3 66666
5 77777
2)
Code:
1 91
2 82
2 21
3 73
4 64
5 45
result :
Code:
1 22222 91
2 33333 82
2 33333 21
2 44444 82
2 44444 21
2 55555 82
2 55555 21
3 66666 73
5 77777 45
B match with A,both B and A have duplicate. record in file(1 should match every record in file(2) Can this solved by splice?
Back to top
Frank Yaeger Sort Forum Moderator Joined: 02 Dec 2002 Posts: 1618 Topics: 31 Location: San Jose
Posted: Sat Apr 22, 2006 10:02 am Post subject:
I believe that's a "cartesian join". I haven't been able to figure out a way to do that with SPLICE. _________________ Frank Yaeger - DFSORT Development Team (IBM)
Specialties: JOINKEYS, FINDREP, WHEN=GROUP, ICETOOL, Symbols, Migration
DFSORT is on the Web at:
www.ibm.com/storage/dfsort
Back to top
kolusu Site Admin Joined: 26 Nov 2002 Posts: 12376 Topics: 75 Location: San Jose
Posted: Sat Apr 22, 2006 4:35 pm Post subject:
issac1029 ,
The following DFSORT/ICETOOL JCL will give you the desired results provided that you have the PTFs UQ95214 and UQ95213 from dec 2004 installed which supports IFTHEN,BUILD and restart parms.
Assumptions:
1. Both the input files are of FB recfm and 80 Bytes Lrecl
2. Each key can have a max of 10 duplicates in both the files.
A brief explanation of the job.
1. The first COPY operator takes in file1 and adds key seq num at the end of every record using RESTART parm. Based on this keyseq number we use IFTHEN and arrange the contents.This is done to get 1 single record with all the possible values.
2. The Splice operatorr takes the output from the step1 copy and creates a single record. ie the output from the splice will be as follows
Code:
1 91
2 82 21
3 73
4 64
5 45
Notice the 2 duplicates of key "2" are clubbed as single record and both the values are side by side
3. Repeat step1 for the other file.
4. Repeat step2 for the other file. The output from this step will be
Code:
1 22222
2 33333 44444 55555
3 66666
5 77777
Notice the 3 duplicates of key "2" are clubbed as single record and the 3 values are side by side
5. Now we take the output of step2 and step4 and SPLICE once again so that we can join the records together.
Code:
1 22222 1 91
2 33333 44444 55555 2 82 21
3 66666 3 73
5 77777 5 45
Now using outfil we break the records in to the desired format.
6. The last COPY operator eliminates the unwanted records.
Code:
//STEP0100 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN1 DD *
1 91
2 82
2 21
3 73
4 64
5 45
//IN2 DD *
1 22222
2 33333
2 44444
2 55555
3 66666
5 77777
//TOOLIN DD *
COPY FROM(IN1) USING(CTL1)
SPLICE FROM(T1) TO(T3) ON(1,1,CH) KEEPNODUPS -
WITHEACH WITH(73,3) WITH(76,3) -
WITH(79,3) WITH(82,3) WITH(85,3) WITH(88,3) -
WITH(91,3) WITH(94,3) WITH(97,3) USING(CTL2)
COPY FROM(IN2) USING(CTL3)
SPLICE FROM(T2) TO(T4) ON(1,1,CH) KEEPNODUPS -
WITHEACH WITH(9,6) WITH(15,6) -
WITH(21,6) WITH(27,6) WITH(33,6) WITH(39,6) -
WITH(45,6) WITH(51,6) WITH(57,6) USING(CTL4)
SPLICE FROM(CON) TO(T5) ON(1,1,CH) KEEPNODUPS -
WITHALL WITH(70,3) WITH(73,3) WITH(76,3) -
WITH(79,3) WITH(82,3) WITH(85,3) WITH(88,3) -
WITH(91,3) WITH(94,3) WITH(97,3) USING(CTL5)
COPY FROM(T5) USING(CTL6)
//T1 DD DSN=&T1,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//T2 DD DSN=&T2,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//T3 DD DSN=&T3,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//T4 DD DSN=&T4,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//T5 DD DSN=&T5,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//CON DD DSN=&T4,VOL=REF=*.T4,DISP=OLD
// DD DSN=&T3,VOL=REF=*.T3,DISP=OLD
//OUT DD SYSOUT=*
//CTL1CNTL DD *
INREC OVERLAY=(81:SEQNUM,8,ZD,RESTART=(1,1))
OUTREC IFTHEN=(WHEN=(81,8,ZD,EQ,+1),
BUILD=(1:1,2,70:3,3,27X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+2),
BUILD=(1:1,2,70:03X,73:3,3,24X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+3),
BUILD=(1:1,2,70:06X,76:3,3,21X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+4),
BUILD=(1:1,2,70:09X,79:3,3,18X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+5),
BUILD=(1:1,2,70:12X,82:3,3,15X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+6),
BUILD=(1:1,2,70:15X,85:3,3,12X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+7),
BUILD=(1:1,2,70:18X,88:3,3,09X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+8),
BUILD=(1:1,2,70:21X,91:3,3,06X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+9),
BUILD=(1:1,2,70:24X,94:3,3,03X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+10),
BUILD=(1:1,2,70:27X,97:3,3))
OUTFIL FNAMES=T1
//CTL2CNTL DD *
OPTION EQUALS
SORT FIELDS=(1,1,CH,A)
OUTFIL FNAMES=T3
//CTL3CNTL DD *
INREC OVERLAY=(81:SEQNUM,8,ZD,RESTART=(1,1))
OUTREC IFTHEN=(WHEN=(81,8,ZD,EQ,+1),
BUILD=(1:1,2,03:03,6,99:X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+2),
BUILD=(1:1,2,03:06X,09:3,6,48X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+3),
BUILD=(1:1,2,03:12X,15:3,6,42X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+4),
BUILD=(1:1,2,03:18X,21:3,6,36X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+5),
BUILD=(1:1,2,03:24X,27:3,6,30X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+6),
BUILD=(1:1,2,03:30X,33:3,6,24X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+7),
BUILD=(1:1,2,03:36X,39:3,6,18X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+8),
BUILD=(1:1,2,03:42X,45:3,6,12X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+9),
BUILD=(1:1,2,03:48X,51:3,6,06X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+10),
BUILD=(1:1,2,03:54X,57:3,6))
OUTFIL FNAMES=T2
//CTL4CNTL DD *
OPTION EQUALS
SORT FIELDS=(1,1,CH,A)
OUTFIL FNAMES=T4
//CTL5CNTL DD *
OPTION EQUALS
SORT FIELDS=(1,1,CH,A)
OUTFIL FNAMES=T5,
OUTREC=(1,2,03,6,70,3,80:X,/,
1,2,03,6,73,3,80:X,/,
1,2,03,6,76,3,80:X,/,
1,2,03,6,79,3,80:X,/,
1,2,03,6,82,3,80:X,/,
1,2,03,6,85,3,80:X,/,
1,2,03,6,88,3,80:X,/,
1,2,03,6,91,3,80:X,/,
1,2,03,6,94,3,80:X,/,
1,2,03,6,97,3,80:X,/,
1,2,09,6,70,3,80:X,/,
1,2,09,6,73,3,80:X,/,
1,2,09,6,76,3,80:X,/,
1,2,09,6,79,3,80:X,/,
1,2,09,6,82,3,80:X,/,
1,2,09,6,85,3,80:X,/,
1,2,09,6,88,3,80:X,/,
1,2,09,6,91,3,80:X,/,
1,2,09,6,94,3,80:X,/,
1,2,09,6,97,3,80:X,/,
1,2,15,6,70,3,80:X,/,
1,2,15,6,73,3,80:X,/,
1,2,15,6,76,3,80:X,/,
1,2,15,6,79,3,80:X,/,
1,2,15,6,82,3,80:X,/,
1,2,15,6,85,3,80:X,/,
1,2,15,6,88,3,80:X,/,
1,2,15,6,91,3,80:X,/,
1,2,15,6,94,3,80:X,/,
1,2,15,6,97,3,80:X,/,
1,2,21,6,70,3,80:X,/,
1,2,21,6,73,3,80:X,/,
1,2,21,6,76,3,80:X,/,
1,2,21,6,79,3,80:X,/,
1,2,21,6,82,3,80:X,/,
1,2,21,6,85,3,80:X,/,
1,2,21,6,88,3,80:X,/,
1,2,21,6,91,3,80:X,/,
1,2,21,6,94,3,80:X,/,
1,2,21,6,97,3,80:X,/,
1,2,27,6,70,3,80:X,/,
1,2,27,6,73,3,80:X,/,
1,2,27,6,76,3,80:X,/,
1,2,27,6,79,3,80:X,/,
1,2,27,6,82,3,80:X,/,
1,2,27,6,85,3,80:X,/,
1,2,27,6,88,3,80:X,/,
1,2,27,6,91,3,80:X,/,
1,2,27,6,94,3,80:X,/,
1,2,27,6,97,3,80:X,/,
1,2,33,6,70,3,80:X,/,
1,2,33,6,73,3,80:X,/,
1,2,33,6,76,3,80:X,/,
1,2,33,6,79,3,80:X,/,
1,2,33,6,82,3,80:X,/,
1,2,33,6,85,3,80:X,/,
1,2,33,6,88,3,80:X,/,
1,2,33,6,91,3,80:X,/,
1,2,33,6,94,3,80:X,/,
1,2,33,6,97,3,80:X,/,
1,2,39,6,70,3,80:X,/,
1,2,39,6,73,3,80:X,/,
1,2,39,6,76,3,80:X,/,
1,2,39,6,79,3,80:X,/,
1,2,39,6,82,3,80:X,/,
1,2,39,6,85,3,80:X,/,
1,2,39,6,88,3,80:X,/,
1,2,39,6,91,3,80:X,/,
1,2,39,6,94,3,80:X,/,
1,2,39,6,97,3,80:X,/,
1,2,45,6,70,3,80:X,/,
1,2,45,6,73,3,80:X,/,
1,2,45,6,76,3,80:X,/,
1,2,45,6,79,3,80:X,/,
1,2,45,6,82,3,80:X,/,
1,2,45,6,85,3,80:X,/,
1,2,45,6,88,3,80:X,/,
1,2,45,6,91,3,80:X,/,
1,2,45,6,94,3,80:X,/,
1,2,45,6,97,3,80:X,/,
1,2,51,6,70,3,80:X,/,
1,2,51,6,73,3,80:X,/,
1,2,51,6,76,3,80:X,/,
1,2,51,6,79,3,80:X,/,
1,2,51,6,82,3,80:X,/,
1,2,51,6,85,3,80:X,/,
1,2,51,6,88,3,80:X,/,
1,2,51,6,91,3,80:X,/,
1,2,51,6,94,3,80:X,/,
1,2,51,6,97,3,80:X,/,
1,2,57,6,70,3,80:X,/,
1,2,57,6,73,3,80:X,/,
1,2,57,6,76,3,80:X,/,
1,2,57,6,79,3,80:X,/,
1,2,57,6,82,3,80:X,/,
1,2,57,6,85,3,80:X,/,
1,2,57,6,88,3,80:X,/,
1,2,57,6,91,3,80:X,/,
1,2,57,6,94,3,80:X,/,
1,2,57,6,97,3,80:X)
//CTL6CNTL DD *
OMIT COND=(3,5,CH,EQ,C' ',OR,10,3,CH,EQ,C' ')
OUTFIL FNAMES=OUT
/*
Hope this helps...
Cheers
Kolusu _________________ Kolusu
www.linkedin.com/in/kolusu
Back to top
Frank Yaeger Sort Forum Moderator Joined: 02 Dec 2002 Posts: 1618 Topics: 31 Location: San Jose
Posted: Mon Apr 24, 2006 1:19 pm Post subject:
Kolusu,
Very clever. 8)
Kind of tedious to code all those statements, but it does work.
Here's a little less tedious version. I removed various redundant operands:
Code:
//STEP0100 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN1 DD *
1 91
2 82
2 21
3 73
4 64
5 45
//IN2 DD *
1 22222
2 33333
2 44444
2 55555
3 66666
5 77777
//TOOLIN DD *
COPY FROM(IN1) TO(T1) USING(CTL1)
SPLICE FROM(T1) TO(T3) ON(1,1,CH) KEEPNODUPS -
WITHEACH WITH(73,3) WITH(76,3) -
WITH(79,3) WITH(82,3) WITH(85,3) WITH(88,3) -
WITH(91,3) WITH(94,3) WITH(97,3)
COPY FROM(IN2) TO(T2) USING(CTL3)
SPLICE FROM(T2) TO(T4) ON(1,1,CH) KEEPNODUPS -
WITHEACH WITH(9,6) WITH(15,6) -
WITH(21,6) WITH(27,6) WITH(33,6) WITH(39,6) -
WITH(45,6) WITH(51,6) WITH(57,6)
SPLICE FROM(CON) TO(T5) ON(1,1,CH) KEEPNODUPS -
WITHALL WITH(70,3) WITH(73,3) WITH(76,3) -
WITH(79,3) WITH(82,3) WITH(85,3) WITH(88,3) -
WITH(91,3) WITH(94,3) WITH(97,3) USING(CTL5)
COPY FROM(T5) TO(OUT) USING(CTL6)
//T1 DD DSN=&T1,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//T2 DD DSN=&T2,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//T3 DD DSN=&T3,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//T4 DD DSN=&T4,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//T5 DD DSN=&T5,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//CON DD DSN=&T4,VOL=REF=*.T4,DISP=OLD
// DD DSN=&T3,VOL=REF=*.T3,DISP=OLD
//OUT DD DSN=&&O1,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//CTL1CNTL DD *
INREC OVERLAY=(81:SEQNUM,8,ZD,RESTART=(1,1))
OUTREC IFOUTLEN=99,
IFTHEN=(WHEN=(81,8,ZD,EQ,+1),
BUILD=(1:1,1,70:3,3)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+2),
BUILD=(1:1,2,73:3,3)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+3),
BUILD=(1:1,2,76:3,3)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+4),
BUILD=(1:1,2,79:3,3)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+5),
BUILD=(1:1,2,82:3,3)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+6),
BUILD=(1:1,2,85:3,3)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+7),
BUILD=(1:1,2,88:3,3)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+8),
BUILD=(1:1,2,91:3,3)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+9),
BUILD=(1:1,2,94:3,3)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+10),
BUILD=(1:1,2,97:3,3))
//CTL3CNTL DD *
INREC OVERLAY=(81:SEQNUM,8,ZD,RESTART=(1,1))
OUTREC IFOUTLEN=99,
IFTHEN=(WHEN=(81,8,ZD,EQ,+1),
BUILD=(1:1,2,3:03,6)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+2),
BUILD=(1:1,2,9:3,6)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+3),
BUILD=(1:1,2,15:3,6)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+4),
BUILD=(1:1,2,21:3,6)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+5),
BUILD=(1:1,2,27:3,6)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+6),
BUILD=(1:1,2,33:3,6)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+7),
BUILD=(1:1,2,39:3,6)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+8),
BUILD=(1:1,2,45:3,6)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+9),
BUILD=(1:1,2,51:3,6)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+10),
BUILD=(1:1,2,57:3,6))
//CTL5CNTL DD *
OUTFIL FNAMES=T5,
OUTREC=(1,2,3,6,70,3,80:X,/,
1,2,3,6,73,3,/,
1,2,3,6,76,3,/,
1,2,3,6,79,3,/,
1,2,3,6,82,3,/,
1,2,3,6,85,3,/,
1,2,3,6,88,3,/,
1,2,3,6,91,3,/,
1,2,3,6,94,3,/,
1,2,3,6,97,3,/,
1,2,9,6,70,3,/,
1,2,9,6,73,3,/,
1,2,9,6,76,3,/,
1,2,9,6,79,3,/,
1,2,9,6,82,3,/,
1,2,9,6,85,3,/,
1,2,9,6,88,3,/,
1,2,9,6,91,3,/,
1,2,9,6,94,3,/,
1,2,9,6,97,3,/,
1,2,15,6,70,3,/,
1,2,15,6,73,3,/,
1,2,15,6,76,3,/,
1,2,15,6,79,3,/,
1,2,15,6,82,3,/,
1,2,15,6,85,3,/,
1,2,15,6,88,3,/,
1,2,15,6,91,3,/,
1,2,15,6,94,3,/,
1,2,15,6,97,3,/,
1,2,21,6,70,3,/,
1,2,21,6,73,3,/,
1,2,21,6,76,3,/,
1,2,21,6,79,3,/,
1,2,21,6,82,3,/,
1,2,21,6,85,3,/,
1,2,21,6,88,3,/,
1,2,21,6,91,3,/,
1,2,21,6,94,3,/,
1,2,21,6,97,3,/,
1,2,27,6,70,3,/,
1,2,27,6,73,3,/,
1,2,27,6,76,3,/,
1,2,27,6,79,3,/,
1,2,27,6,82,3,/,
1,2,27,6,85,3,/,
1,2,27,6,88,3,/,
1,2,27,6,91,3,/,
1,2,27,6,94,3,/,
1,2,27,6,97,3,/,
1,2,33,6,70,3,/,
1,2,33,6,73,3,/,
1,2,33,6,76,3,/,
1,2,33,6,79,3,/,
1,2,33,6,82,3,/,
1,2,33,6,85,3,/,
1,2,33,6,88,3,/,
1,2,33,6,91,3,/,
1,2,33,6,94,3,/,
1,2,33,6,97,3,/,
1,2,39,6,70,3,/,
1,2,39,6,73,3,/,
1,2,39,6,76,3,/,
1,2,39,6,79,3,/,
1,2,39,6,82,3,/,
1,2,39,6,85,3,/,
1,2,39,6,88,3,/,
1,2,39,6,91,3,/,
1,2,39,6,94,3,/,
1,2,39,6,97,3,/,
1,2,45,6,70,3,/,
1,2,45,6,73,3,/,
1,2,45,6,76,3,/,
1,2,45,6,79,3,/,
1,2,45,6,82,3,/,
1,2,45,6,85,3,/,
1,2,45,6,88,3,/,
1,2,45,6,91,3,/,
1,2,45,6,94,3,/,
1,2,45,6,97,3,/,
1,2,51,6,70,3,/,
1,2,51,6,73,3,/,
1,2,51,6,76,3,/,
1,2,51,6,79,3,/,
1,2,51,6,82,3,/,
1,2,51,6,85,3,/,
1,2,51,6,88,3,/,
1,2,51,6,91,3,/,
1,2,51,6,94,3,/,
1,2,51,6,97,3,/,
1,2,57,6,70,3,/,
1,2,57,6,73,3,/,
1,2,57,6,76,3,/,
1,2,57,6,79,3,/,
1,2,57,6,82,3,/,
1,2,57,6,85,3,/,
1,2,57,6,88,3,/,
1,2,57,6,91,3,/,
1,2,57,6,94,3,/,
1,2,57,6,97,3)
//CTL6CNTL DD *
OMIT COND=(3,5,CH,EQ,C' ',OR,9,3,CH,EQ,C' ')
/*
_________________ Frank Yaeger - DFSORT Development Team (IBM)
Specialties: JOINKEYS, FINDREP, WHEN=GROUP, ICETOOL, Symbols, Migration
DFSORT is on the Web at:
www.ibm.com/storage/dfsort
Back to top
Frank Yaeger Sort Forum Moderator Joined: 02 Dec 2002 Posts: 1618 Topics: 31 Location: San Jose
Posted: Fri Nov 20, 2009 1:44 pm Post subject:
With z/OS DFSORT V1R5 PTF UK51706 or z/OS DFSORT V1R10 PTF UK51707 (Nov, 2009), DFSORT now supports the JOINKEYS function which can do this kind of thing much more easily. For example:
Code:
//S1 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//IN1 DD *
1 22222
2 33333
2 44444
2 55555
3 66666
5 77777
//IN2 DD *
1 91
2 82
2 21
3 73
4 64
5 45
//SORTOUT DD SYSOUT=*
//SYSIN DD *
JOINKEYS F1=IN1,FIELDS=(1,1,A)
JOINKEYS F2=IN2,FIELDS=(1,1,A)
REFORMAT FIELDS=(F1:1,14,F2:15,2)
OPTION COPY
/*
SORTOUT would have:
Code:
1 22222 91
2 33333 82
2 33333 21
2 44444 82
2 44444 21
2 55555 82
2 55555 21
3 66666 73
5 77777 45
_________________ Frank Yaeger - DFSORT Development Team (IBM)
Specialties: JOINKEYS, FINDREP, WHEN=GROUP, ICETOOL, Symbols, Migration
DFSORT is on the Web at:
www.ibm.com/storage/dfsort
Back to top
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum