Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 用于排序唯一文件的简单差异/修补程序脚本_Shell_Sorting_Text Files_Unique_Patch - Fatal编程技术网

Shell 用于排序唯一文件的简单差异/修补程序脚本

Shell 用于排序唯一文件的简单差异/修补程序脚本,shell,sorting,text-files,unique,patch,Shell,Sorting,Text Files,Unique,Patch,我怎样才能写出一个简单的差分响应呢。用于对文件中的行列表应用添加和删除的修补程序脚本 这可能是原始文件(已排序且每行都是唯一的): 一个简单的补丁文件可以如下所示(或者简单到): 生成的文件应如下所示(或以任何其他顺序,因为sort可以以任何方式应用): 正常的补丁格式无法使用,因为它们包含上下文,在这种情况下可能会发生变化。由于没有人能给我答案,我创建了一个小python脚本,它正好可以完成这项工作 要应用此修补程序,请使用调用它(其中生成outfile.txt) 要生成修补程序/diff,请

我怎样才能写出一个简单的差分响应呢。用于对文件中的行列表应用添加和删除的修补程序脚本

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

一个简单的补丁文件可以如下所示(或者简单到):

生成的文件应如下所示(或以任何其他顺序,因为
sort
可以以任何方式应用):


正常的补丁格式无法使用,因为它们包含上下文,在这种情况下可能会发生变化。

由于没有人能给我答案,我创建了一个小python脚本,它正好可以完成这项工作

要应用此修补程序,请使用调用它(其中生成
outfile.txt

要生成修补程序/diff,请使用调用它(其中生成了
patchfile.txt


使用
comm
awk
grep
应用此类修补程序的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
要生成修补程序文件,请执行以下操作:

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

仅读取一次输入文件的Bash替代方案:

要生成修补程序,您可以:

comm -3 a.txt b.txt | sed 's/^\t/+ /;t;s/^/- /'
{ <patch.txt tee >(grep '^+ ' | cut -c3- >&5) |
grep '^- ' | cut -c3- | comm -13 - a.txt; } 5> >(cat)
因为
comm
delimeters使用tab从不同文件输出,所以我们可以使用该选项卡来检测是否应该添加或删除行

要应用修补程序,您可以:

comm -3 a.txt b.txt | sed 's/^\t/+ /;t;s/^/- /'
{ <patch.txt tee >(grep '^+ ' | cut -c3- >&5) |
grep '^- ' | cut -c3- | comm -13 - a.txt; } 5> >(cat)
{(grep'^+'| cut-c3->&5)|
grep'^-'| cut-c3-|comm-13-a.txt;}5>>(cat)
tee
将输入(即补丁文件)拆分为两个流。第一部分已过滤并输出到文件描述符
5
。文件描述符
5
被打开为刚好
>(cat)
,因此它只是在stdout上输出。第二部分过滤负号
-
,并与
a.txt连接并输出。因为输出应该是行缓冲的,所以它应该可以工作。

Cool B-)只需添加
| sort-u
就可以在应用补丁后得到一个排序文件。
{ <patch.txt tee >(grep '^+ ' | cut -c3- >&5) |
grep '^- ' | cut -c3- | comm -13 - a.txt; } 5> >(cat)