比较两个文件并包括匹配和不匹配记录

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。如果您有大量数据,您会注意到差异。如果您没有大量数据,那么您会从中受益。

以上是关于比较两个文件并包括匹配和不匹配记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 awk 比较两个文件并打印不匹配的记录

SSIS - 比较文本文件和非oledb连接以提供匹配和不匹配的输出

Ms Access 比较两个记录集

如何比较两个数据表并使用多个线程更新第一个数据表?

比较两个记录集变量给出类型不匹配

如何使用排序从输出文件 1 中的 F1 和 F2 中获取匹配记录,以及从输出文件 2 中的 F2 中获取不匹配记录