【问题标题】:Comparing two large files having different order using Unix shell script使用 Unix shell 脚本比较两个具有不同顺序的大文件
【发布时间】:2025-12-22 13:50:16
【问题描述】:

我有两个文本文件,每个大小为 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)方法也可以考虑。

任何帮助将不胜感激

【问题讨论】:

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

标签: shell unix informatica-powercenter


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 informatica 中加载这两个文件。

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

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

    【讨论】:

      【解决方案3】:

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

      为什么不能使用排序器转换对数据进行排序?

      我的方法是连接前 3 列(名称、地址 1、地址 2)并将其作为键,然后使用连接器转换来匹配数据。

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

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

      【讨论】:

        【解决方案4】:

        首先尝试重构您的数据。

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

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

        【讨论】:

          最近更新 更多