我们会定期从我们无法控制的外部来源接收 CSV 文件。这些文件是完整的当前记录集;但是,自上次以来删除的任何记录都不存在。我们想比较这两个文件并创建一个单独的已删除记录文件,以便我们可以对它们进行一些额外的处理。在另一个领域的应用程序中,我们有一个开箱即用的商业排序包(CoSort);但是,我们在这里无法访问它。不过,数量并没有那么大,而且标准或免费工具似乎可以很容易地处理这些问题。理想情况下,这将采用 Windows 批处理文件的形式,但 Perl 或 awk 解决方案也可以。输入文件示例:
上一个文件:
X_KEY,X_NAME,X_ATTRIBUTE
123,Name 123,ATT X
111,Name 111,ATT X
777,Name 777,ATT Y
传入文件:
X_KEY,X_NAME,X_ATTRIBUTE
777,Name 777,ATT Y
123,Name 123,ATT CHANGED
结果文件应至少:
111,Name 111
但是,如果删除记录的属性也能通过,那也没关系。
到目前为止,我有一个批处理文件,它使用免费软件 CMSort 对两个文件进行排序,减去标题记录,以便更容易进行某种类型的差异处理:
REM Sort Previous File, Skip Header
C:\Software\CMSort\cmsort.exe /H=1 x_previous.txt x_previous_sorted.txt
REM Sort Incoming File, Skip Header
G:\Software\CMSort\cmsort.exe /H=1 x_incoming.txt x_incoming_sorted.txt
但是“比较并仅显示第一个文件中缺失的记录”这一点让我难以理解。复杂性的部分原因是许多属性可以在留下的记录中发生变化,因此它不是纯粹的差异。然而,它感觉像是一个专门的 diff 命令——一个仅限于检查关键字段而不是整个记录的命令。不过,我似乎无法获得正确的语法。想法?记录数不应超过 50k 条记录。
注意:如果这是 SQL 并且数据位于表中,我们可以使用 EXCEPT operator但在这种情况下将数据移动到数据库不是一种选择。
最佳答案
diff a.input b.input | grep ^[\>]
关于windows - 在 Windows 中,如何比较两个文件并只返回第二个文件中丢失的记录,这些记录最初存在于第一个文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827358/