我对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
非常感谢!
答案 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
。