Unix diff与自定义行分隔符

时间:2016-07-01 15:33:21

标签: csv unix diff

想要比较两个CSV文件。假设字段分隔符是$,每个记录有两个字段,文件的格式可以是:

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

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

理想情况下,我希望保证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$

2 个答案:

答案 0 :(得分:1)

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

您可以尝试使用sed两次:sed将您的格式转换为每行一个记录以进行差异化;差异转换文件;恢复多行记录格式。

首先,sed会将所有$\n转换为真实\n;和\n之前没有$的{​​{1}}一些独特的特殊序列,例如#%#$%#$%#$#

然后做差异。

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

答案 1 :(得分:1)

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

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

  

csvdiff允许您比较两个CSV文件的语义内容,忽略行和列排序等内容以获得实际更改的内容。如果您将自动系统的输出从一天比较到下一天,这非常有用,这样您就可以查看更改的内容。

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

  

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

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

  

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