使用Unix shell脚本比较两个具有不同顺序的大文件

时间:2018-05-19 11:57:46

标签: shell unix informatica-powercenter

我有两个大小为3.5GB的文本文件,我想用Unix脚本进行比较。这些文件中包含大约500万条记录。

文件的布局如下所示。

*<sysdate>
<Agent Name 1>
<Agent Address 1>
<Agent Address 2>
<Agent Address 3>
...
<Agent Name 2>
<Agent Address 1>
<Agent Address 2>
<Agent Address 3>
...
<Total number of records present>*

示例文件。

<sysdate>
Sachin Tendulkar    11051973    M
AddrID1     AddrLn11        AddrLn12        City1   State1  Country1    Phn1    OffcAddr11  OffcAddr12  St1 Cntry1
AddrID2     AddrLn21        AddrLn22        City2   State2  Country2    Phn2    OffcAddr21  OffcAddr22  St2 Cntry2
...
Sourav Ganguly  04221975    M
AddrID1     AddrLn11        AddrLn12        City1   State1  Country1    Phn1    OffcAddr11  OffcAddr12  St1 Cntry1
AddrID2     AddrLn21        AddrLn22        City2   State2  Country2    Phn2    OffcAddr21  OffcAddr22  St2 Cntry2
...
<Total number of records present>

两个文件中代理地址的顺序不同。我需要查找存在于一个文件中但不存在于另一个文件中的记录以及不匹配的记录。我最初尝试使用Unix排序命令对文件进行排序,但由于服务器空间问题而失败。也可以考虑ETL(Informatica)方法。

任何帮助将不胜感激

4 个答案:

答案 0 :(得分:0)

您可以使用awk并在每次匹配Agent Name时开始写入新文件,并为该文件指定代理的名称(使用前三个字符在子目录中的perkaps) 。接下来比较两个输入文件(diff -r)中的目录(树) 另一个解决方案是导入两个不同表中的所有记录并使用sql进行比较:

select name from table1 where name not in (select name from table2);
select name from table2 where name not in (select name from table1);
select name from table1 
inner join table2 on table1.name=table2.name
where table1.address1 <> table2.address1
   or table1.address2 <> table2.address2
   ...

答案 1 :(得分:0)

在informatica中加载两个文件。

通过连接每列来查找每行的MD5,例如: MD5(COL1 || || Col2中COL3)

现在使用joiner比较每个文件的MD5值,这样就可以找到匹配和不匹配的行。

答案 2 :(得分:0)

首先,发送第二个文件的示例

为什么您无法使用分拣机转换对数据进行分类?

我的approuch将连接前3列(name,addres1,addres2)并将其作为键,然后使用joiner转换来匹配数据。

您还可以进行联合转换,然后进行聚合器转换,以计算您创建的密钥的次数 如果计数等于2,则表示数据在两个文件中 如果计数等于1,则表示数据仅为1个文件

将有关问题的更多信息发送给更具体的

答案 3 :(得分:0)

首先尝试重新构建数据。

继续将AgentName和其他字段添加到与该代理相关的每个地址。使用简单的棘手的表达式逻辑,如变量/计数方法来实现这一点。通过这样做,您的平面文件将是比较友好的&amp;可以在UNIX或Informatica中轻松比较。

如果您对此解决方案感兴趣,请告诉我,我们会为您提供更多帮助。