比较两个文件并包括匹配和不匹配记录
Posted
技术标签:
【中文标题】比较两个文件并包括匹配和不匹配记录【英文标题】:Compare two files and include both match and non match records 【发布时间】:2015-10-26 17:51:48 【问题描述】:我需要将两个文件合并为一个 . 假设我有 2 个输入文件 FILE1 和 FILE2。我需要将 FILE1 和 FILE2 中的不匹配记录写入 FILE 3 以及我想将匹配记录也写入 FILE3。如果基于 FILE1 和 FILE2 中的键匹配,则必须从 FILE1 中选择要写入的匹配记录/FILE2 基于某些条件。
两个输入文件中的关键位置相同。
谁能帮我写 SORTCARD,我怎样才能在 SyncSort 或 DFSort 中一步完成??
【问题讨论】:
Compare two files and write it to "match" and "nomatch" files的可能重复 谢谢比尔。我的问题与您在链接中提到的不完全相同,但帮助我找到了解决方案。 【参考方案1】:尝试使用连接键
SORT FIELDS=COPY
JOINKEYS FILES=F1,FIELDS=(1,5,A)
JOINKEYS FILES=F2,FIELDS=(1,5,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,6,F2:1,80)
在重新格式化字段中,您可以根据需要提及字段,即,如果您想从 file2 中选择匹配的记录,请在 F2 旁边提及这些字段:
【讨论】:
那么你怎么知道F1是否匹配,或F1不匹配,或F2不匹配?【参考方案2】:我使用以下分类卡获得了解决方案:
JOINKEYS F1=IN1,FIELDS=(1,7,A,13,7,A)
JOINKEYS F2=IN2,FIELDS=(1,7,A,13,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,239,F2:1,239,?)
OPTION COPY
OUTFIL FNAMES=OUT1,INCLUDE=(479,1,SS,EQ,C'1,2'),
IFTHEN=(WHEN=(479,1,CH,EQ,C'1'),
BUILD=(1,239,479,1)),
IFTHEN=(WHEN=NONE,
BUILD=(240,239,479,1))
OUTFIL FNAMES=OUT2,INCLUDE=(479,1,SS,EQ,C'B'),
IFTHEN=(WHEN=(111,1,FS,EQ,NUM,AND,175,1,FS,EQ,NUM),
BUILD=(1,239)),
IFTHEN=(WHEN=(350,1,FS,EQ,NUM,AND,414,1,FS,EQ,NUM),
BUILD=(240,239)),
IFTHEN=(WHEN=NONE,
BUILD=(1,239))
【讨论】:
对于 OUT2,您可以使用 CH 而不是 SS,然后在 OUT1 上使用 SAVE 而不是 INCLUDE。在 OUT2 上可以使用 IFOUTLEN=239,在第二个 IFTHEN 中与第一个 IFTHEN 的负数结合,然后删除第一个和第三个 IFTHEN。 标题几乎一字不差。当您使用关键字时,它是搜索引擎结果的顶部。 @BillWoodger,我同意标题几乎相似,对此感到抱歉。如果然后使用 IFOUTLEN=239,你能解释一下我如何删除第一个和第三个。我检查了 DFSORT 手册,IFOUTLEN 为 IFTHEN 覆盖了 OUTREC LRECL。我想我已经在 BUILD 中给出了记录的长度。 很高兴您同意。关键是,如果您使用 IFOUTLEN,您可以删除两个 BUILD。如果您有大量数据,您会注意到差异。如果您没有大量数据,那么您会从中受益。以上是关于比较两个文件并包括匹配和不匹配记录的主要内容,如果未能解决你的问题,请参考以下文章