k0p*_*kus 1 diff text-processing csv
我有两个 csv 文件,我想在其中找出删除、修改和添加的行。(第一个字段是唯一的 ID。)
第一个文件看起来像:
0, WILL_BE_REMOVED
1, OLD
2, SAME
3, SAME
Run Code Online (Sandbox Code Playgroud)
和一个更新的 csv 文件:
1, CHANGED
2, SAME
3, SAME
4, ADDED
5, ADDED
Run Code Online (Sandbox Code Playgroud)
我在想这diff可能会告诉我,但是当我跑步时:
diff newer_file.csv older_file.csv
1c1,2
< 1, CHANGED
---
> 0, WILL_BE_REMOVED
> 1, OLD
4,5c5
< 4, ADDED
< 5, ADDED
---
>
Run Code Online (Sandbox Code Playgroud)
我看到一条改变的线,类似于添加的线。有没有办法区分更改和添加?
我可以用 diff 实现我想要的吗?如果没有,其他一些 bash 工具是否适合我的用例?
DELETED: 0, WILL_BE_REMOVED
UPDATED: 1, CHANGED
ADDED 4,
ADDED 5,
Run Code Online (Sandbox Code Playgroud)
使用-c选项(复制的上下文)将允许您区分更改和添加:
diff -c older_file.csv newer_file.csv
Run Code Online (Sandbox Code Playgroud)
产生(在标题之后)
*** 1,4 ****
! 0, WILL_BE_REMOVED
! 1, OLD
2, SAME
3, SAME
--- 1,5 ----
! 1, CHANGED
2, SAME
3, SAME
+ 4, ADDED
+ 5, ADDED
Run Code Online (Sandbox Code Playgroud)
更改行以 开头!,添加的行以 开头+。删除的行以-.
diff可以“合并”更改,因此最终可能会考虑添加的行是更大更改的一部分,并用!. 您可以在上面看到这一点,其中删除的行被视为影响前两行的较大更改的一部分,因此最终标记!为-。
并排比较 ( diff -y) 有助于突出您尝试实现的一些问题:
0, WILL_BE_REMOVED | 1, CHANGED
1, OLD <
2, SAME 2, SAME
3, SAME 3, SAME
> 4, ADDED
> 5, ADDED
Run Code Online (Sandbox Code Playgroud)
diff 不知道各个行的内部结构,所以无法确定旧文件中的前两行中的哪一行被删除,甚至是否应该考虑删除两行并添加一行,而不是删除一行一个变了。