仅保留2个CSV文件之间的差异(以及上面和下面的一些行)

时间:2017-05-12 21:11:31

标签: bash shell

我对shell脚本非常陌生,并且不确定如何去做这件事 假设我有两个文件:

file1.csv | file2.csv
--------------------
Apples      Apples
Dogs        Dogs
Cats        Cats
Grapes      Oranges
Batman      Thor
Borgs       Daleks
Kites       Kites
Blah        Blah
xyz         xyz

我如何只保留每个文件中的差异,差异开始上方2行,之后2行?例如,输出将是:

file1.csv  |  file2.csv
-----------------------
Dogs          Dogs
Cats          Cats
Grapes        Oranges
Batman        Thor
Borgs         Daleks
Kites         Kites
Blah          Blah

非常感谢!

1 个答案:

答案 0 :(得分:0)

这是diff的工作。

diff -u2 file1.csv file2.csv | sed '1,3d;/@@/,+2d' > diff

diff命令将产生一个补丁样式差异,其中包含表单中文件的元信息:

--- file1.csv   2017-05-12 15:21:47.564801174 -0700
+++ file2.csv   2017-05-12 15:21:52.462801174 -0700
@@ -2,7 +2,7 @@

任何差异块都会有@@ -2,7 +2,7 @@这样的标题。我们希望使用sed将其丢弃。

1,3d - 表示删除前3行

/@@/,+2d - 删除包含@@的所有行以及后面的后两行。这不是你的情况所必需的,但如果您的输入突然有多个差异块,最好包含在这里。

上述命令的结果将生成此列表。

 Dogs
 Cats
-Grapes
-Batman
-Borgs
+Oranges
+Thor
+Daleks
 Kites
 Blah

内容的前缀为1个字符,' '两者都相同,'-'仅在file1.csv上,而'+'仅在file2.csv上。现在我们只需要将这些文件分发给2个文件。

sed '/^+.*/d;s/^.//' diff > file1.csv
sed '/^-.*/d;s/^.//' diff > file2.csv

此处的sed命令将过滤文件并将正确的内容写入每个输入文件。

/^+.*/d - 以'+'开头的行将被删除。

s/^.// - 将删除由diff添加的1个字符前缀。

/^-.*/d - 以'-'开头的行将被删除。

最后,删除瞬态文件diff