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

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)

Ste*_*itt 5

使用-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 不知道各个行的内部结构,所以无法确定旧文件中的前两行中的哪一行被删除,甚至是否应该考虑删除两行并添加一行,而不是删除一行一个变了。