我有两个 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