如何区分更改的行和添加的行?

如何区分更改的行和添加的行?

我有两个 csv 文件,我想在其中找出删除、修改和添加的行。 (第一个字段是唯一的 ID。)

第一个文件如下所示:

0, WILL_BE_REMOVED
1, OLD
2, SAME
3, SAME

和一个较新的 csv 文件:

1, CHANGED
2, SAME
3, SAME
4, ADDED
5, ADDED

我想这diff可能会告诉我这一点,但当我跑步时:

diff newer_file.csv  older_file.csv 
1c1,2
< 1, CHANGED
---
> 0, WILL_BE_REMOVED
> 1, OLD
4,5c5
< 4, ADDED
< 5, ADDED
---
> 

我看到更改的行与添加的行类似。有没有办法区分更改和添加?

我可以用 diff 实现我想要的吗?如果没有,其他 bash 工具是否适合我的用例?

DELETED: 0, WILL_BE_REMOVED
UPDATED: 1, CHANGED
ADDED 4,
ADDED 5,

答案1

使用-c选项(复制上下文)将允许您区分更改和添加:

diff -c older_file.csv newer_file.csv

产生(在标题之后)

*** 1,4 ****
! 0, WILL_BE_REMOVED
! 1, OLD
  2, SAME
  3, SAME
--- 1,5 ----
! 1, CHANGED
  2, SAME
  3, SAME
+ 4, ADDED
+ 5, ADDED

更改行以 开头!,添加行以 开头+。删除的行以 开头-

diff可以“合并”更改,因此它最终可能会认为添加的行是更大更改的一部分,并用 标记所有内容!。您可以在上面看到这一点,其中删除的行被视为影响前两行的较大更改的一部分,因此最终被标记!而不是-

并排比较 ( diff -y) 有助于突出显示您想要实现的目标的一些问题:

0, WILL_BE_REMOVED    | 1, CHANGED
1, OLD                <
2, SAME                 2, SAME
3, SAME                 3, SAME
                      > 4, ADDED
                      > 5, ADDED

diff不知道各个行的内部结构,因此它无法确定旧文件中的前两行中的哪一行被删除,甚至无法确定是否应该考虑删除两行并添加一行,而不是删除一行其中之一发生了变化。

答案2

daff 是一个很棒的工具http://paulfitz.github.io/daff/

一种专门针对 CSV 的 diff。

答案3

diff在线工作。如果该行不同,则表示为删除和添加。

我不知道有什么工具可以理解“改变”的概念。考虑一下,如果你将一行从red改为yellow(作为一个人)确定该red行是否已被删除并yellow添加了一行,或者同一行被完全更改?

在相关的侧面问题上,我个人更喜欢统一差异。我发现它比脚本更具可读性ed。对于您的示例数据,它将表达如下:

diff -u older_file.csv newer_file.csv
--- older_file.csv      2019-02-04 12:23:32.416529000 +0000
+++ newer_file.csv      2019-02-04 12:23:41.551570700 +0000
@@ -1,4 +1,5 @@
-0, WILL_BE_REMOVED
-1, OLD
+1, CHANGED
 2, SAME
 3, SAME
+4, ADDED
+5, ADDED

相关内容