用于排序的唯一文件的简单diff / patch脚本

时间:2015-07-13 23:37:16

标签: text-files unique patch sorted

我怎么能写一个简单的差异。补丁脚本,用于对文件中的行列表应用添加和删除?

这可能是一个原始文件(它已排序,每行都是唯一的):

a
b
d

一个简单的补丁文件可能看起来像这样(或者说有点简单):

+ c
+ e
- b

生成的文件应该是(或者以任何其他顺序,因为sort可以应用):

a
c
d
e

不能使用普通的补丁格式,因为它们包含上下文,在这种情况下可能会改变。

3 个答案:

答案 0 :(得分:1)

使用commawkgrep来应用这样的补丁的shell解决方案是:

A=a.txt B=b.txt P=patch.txt; { grep '^-' $P | cut -c 3- | comm -23 $A - ; grep '^+' $P | cut -c 3- } | sort -u > $B

生成补丁文件将是:

A=a.txt B=b.txt P=patch.txt; { comm -13 $A $B | awk '{print "+ " $0}' ; comm -23 $A $B | awk '{print "- " $0}' } > $P

答案 1 :(得分:1)

仅读取一次输入文件的Bash选项:

要生成补丁,您可以:

comm -3 a.txt b.txt | sed 's/^\t/+ /;t;s/^/- /'

由于使用制表符,comm从不同文件输出了分度符,因此我们可以使用该制表符来检测是否应添加或删除行。

要应用补丁,您可以:

{ <patch.txt tee >(grep '^+ ' | cut -c3- >&5) |
grep '^- ' | cut -c3- | comm -13 - a.txt; } 5> >(cat)

tee将输入(即补丁文件)分成两个流。第一部分已过滤+,并输出到文件描述符5。文件描述符5仅向>(cat)打开,因此仅在stdout上输出。第二部分已过滤出负数-,并与a.txt连接并输出。因为输出应该是行缓冲的,所以应该可以工作。

答案 2 :(得分:0)

由于没有人能给我一个答案,我已经创建了一个小的python脚本,它完成了这项工作。 https://github.com/white-gecko/simplepatch

要应用此类补丁,请将其调用(生成outfile.txt

./simplepatch.py -m patch -i infile.txt -p patchfile.txt -o outfile.txt

生成补丁/差异调用(生成patchfile.txt

./simplepatch.py -m diff -i infile.txt -o outfile.txt -p patchfile.txt