@
praynise 哦哦,那你可以这样做,先把两个文件按照客户 id 做外排序。然后利用类似于归并排序的归并过程。
我给你准备了一个简单的 sample:
$ cat before.txt
Smith 26 Beijing
Sam 47 Washington
Mary 15 Tokyo
$ cat after.txt
Smith 26 Beijing
Sam 57 Washington
Nancy 21 Paris
这个 Sample 里,新增了 Nancy,删除了 Mary,修改了 Sam。
先做外排序:
$ sort -k1 before.txt > sorted_before.txt
$ sort -k1 after.txt > sorted_after.txt
然后利用归并过程来实现你的需求,具体是这样的:
两个迭代器或者指针 fp_before, fp_after 分别指向 sorted_before.txt 和 sorted_after.txt 的第一行,进行如下迭代:
1. 如果 before_key > after_key,说明 after 中的第一行是新增的,输出结果,fp_after 移动到下一行
2. 如果 before_key < after_key,如果 before 中的第一行被删除了,输出结果,fp_before 移动到下一行
3. 如果 before_key == after_key,两个指针都移动下一行,但是移动前先对比当前两条记录,如果不一致,说明修改了
迭代完后,如果 fp_before 没有到文件末尾,那么剩下的内容都会被删除的记录;如果 fp_after 没有到末尾,那么剩下的内容都会新增的记录。
很遗憾,我不会 Go,用 Python3 写了份代码供你参考,时间有限写得不好请见谅:
#!/usr/env/python3
# -*- coding: utf-8 -*-
with open("sorted_before.txt") as fp_before, \
open("sorted_after.txt") as fp_after:
before = fp_before.readline()
after = fp_after.readline()
while before and after:
before = before.rstrip()
after = after.rstrip()
before_key = before.split()[0]
after_key = after.split()[0]
if after_key < before_key:
print("+", after)
after = fp_after.readline()
elif after_key > before_key:
print("-", before)
before = fp_before.readline()
else:
if before != after:
print(' ', before, "=>", after)
before = fp_before.readline()
after = fp_after.readline()
for before_surplus in fp_before:
print("-", before_surplus)
for after_surplus in fp_after:
print("+", after_surplus)
这份代码跑上面的 sample 的结果:
- Mary 15 Tokyo
+ Nancy 21 Paris
Sam 47 Washington => Sam 57 Washington