Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用unixshell脚本比较两个顺序不同的大文件_Shell_Unix_Informatica Powercenter - Fatal编程技术网

使用unixshell脚本比较两个顺序不同的大文件

使用unixshell脚本比较两个顺序不同的大文件,shell,unix,informatica-powercenter,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> <

我有两个文本文件,每个文件大小为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 sort命令对文件进行排序,但由于服务器空间问题,排序失败。也可以考虑ETL Informatica方法

任何帮助都将不胜感激

您可以使用awk,并在每次匹配代理名称时开始写入新文件,并使用前三个字符在subdir中为该文件指定代理的名称。接下来比较两个输入文件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
   ...

在informatica中,加载两个文件

通过连接每一列来查找每一行的MD5,例如: MD5COL1 | | Col2 | | COL3


现在使用joiner比较每个文件中的两个MD5值,通过这种方式可以找到匹配行和不匹配行。

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

为什么不能使用分拣机转换对数据进行分拣

我的方法是连接前3列名称addres1、addres2并将其作为键,然后使用joiner转换来匹配数据

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


发送有关问题的详细信息,使其更具体

首先尝试重新构造数据

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


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

请发布两个文件的示例,并提供预期输出,清楚显示何时存在匹配或未命中,即,您是否只需要存在/不存在的代理名称,或者不同的地址是否决定了这一点。示例文件已添加。一个是好文件,另一个是错误文件。代理将以相同的顺序出现在两个文件中,但每个代理中的地址顺序不同。错配情况:1。第一个文件可能比第二个文件多几个代理。2.第一个文件在单个代理中可能还有几个地址。也可能有重复的地址ID。3.相同的地址ID在两个文件中可能具有不同的地址行。我需要通过删除错误文件中出现的所有不匹配,使两个文件完全相同。