【问题标题】:Unix diff with custom line separator带有自定义行分隔符的 Unix 差异
【发布时间】:2016-07-02 00:34:08
【问题描述】:

希望比较两个 CSV 文件。假设字段分隔符是 $,每条记录有两个字段,文件可以被格式化为:

a$simple line$
b$run-on-
line$
c$simple line$

是否有一些开关或各种 Unix diff 命令可以让我运行比较,其中记录分隔符(行分隔符)是 $ 符号后紧跟新行?

理想情况下,我希望确保 diff 在检测到任何更改时输出整个记录。

使用默认行为,我可能会获得部分记录作为差异输出(在记录跨越多行的情况下)。

是否有一些我没有考虑的更聪明的方法来做到这一点?

-- 编辑添加:预期输出示例

如果我将上面的 CSV 文件与:

a$simple line$
b$run-on-changed-
line$
c$simple line$

...我希望看到整个记录 b 报告为差异。类似的东西

2c2
< b$run-on-\nline$
---
> b$run-on-changed-\nline$

【问题讨论】:

  • 您能否提供预期输出的示例?
  • 已编辑以添加预期输出示例

标签: csv unix diff


【解决方案1】:

Peter,gnu diff 中没有直接支持自定义行分隔符:http://man7.org/linux/man-pages/man1/diff.1.html (gnu diffutils)

您可以尝试使用sed 两次:sed 将您的格式转换为每行一条记录以进行比较; diff 转换的文件; sed 回到多行记录格式。

首先 sed 会将所有$\n 转换为真正的\n;和 \n 前面没有 $ 到一些独特的特殊序列,如 #%#$%#$%#$#

然后做差异。

第二个 sed 会将 #%#$%#$%#$# 转换回 \n(或转换为 \\n 以便更轻松地查看差异输出)

【讨论】:

    【解决方案2】:

    有支持使用 csv 的 diff 变体。其中一些可能会在字段内处理带有换行符的 csv:

    https://pypi.python.org/pypi/csvdiff (python)

    csvdiff 允许您比较两个 CSV 文件的语义内容,忽略行和列排序等内容,以了解实际更改的内容。如果您要比较自动系统一天到一天的输出,这很有用,这样您就可以查看发生了什么变化。

    https://github.com/agardiner/csv-diff(红宝石)

    与逐行比较的标准 diff 不同,并且对记录的顺序很敏感,CSV-Diff 通过关键字段识别常见行,然后比较每行中字段的内容。

    http://csvdiff.sourceforge.net/ (perl)

    csvdiff 是一个 perl 脚本,用于比较/区分两个(逗号)分隔的文件。与标准差异不同的部分是,您将获得差异发生的记录编号以及不同的字段/列。分隔符可以设置为您想要的值,而不仅仅是逗号。您还可以提供第三个文件,其中包含由分隔符分隔的单(!)行中的列名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多