Bash 比较两个配置文件(关联数组)键差异的最快方法

Bash 比较两个配置文件(关联数组)键差异的最快方法,bash,awk,Bash,Awk,以关联数组(key=value)的形式写入两个文件,如: 文件A: banana=yellow kiwi=green tomato=red 文件B: banana=dislike tomato=like pear=like 我想知道比较钥匙的最佳方法(速度方面): A对B: kiwi=green $ join -t= -j 1 -v 1 <(sort fileA) <(sort fileB) kiwi=green B反对A pear=like awk -F'=' 'NR=

以关联数组(key=value)的形式写入两个文件,如:

文件A:

banana=yellow
kiwi=green
tomato=red
文件B:

banana=dislike
tomato=like
pear=like
我想知道比较钥匙的最佳方法(速度方面):

A对B:

kiwi=green
$ join -t= -j 1 -v 1 <(sort fileA) <(sort fileB) 
kiwi=green
B反对A

pear=like
awk -F'=' 'NR==FNR{a[$1]=$0;next}!($1 in a)' A B
双向的

kiwi=green
pear=like
awk -F'=' '{a[$1]++;v[$1]=$0}END{for(i in a)if(a[i]==1)print v[i]}' A B
我不希望使用循环,因为这些文件可能很大。
B与

pear=like
awk -F'=' 'NR==FNR{a[$1]=$0;next}!($1 in a)' A B
A对B

awk -F'=' 'NR==FNR{a[$1]=$0;next}!($1 in a)' B A
双向的

kiwi=green
pear=like
awk -F'=' '{a[$1]++;v[$1]=$0}END{for(i in a)if(a[i]==1)print v[i]}' A B

所有未测试,如果不起作用,请告诉我。

使用
加入

A对B:

kiwi=green
$ join -t= -j 1 -v 1 <(sort fileA) <(sort fileB) 
kiwi=green

$join-t=-j1-v1我喜欢dogbane的答案,但将使用grep和cut提交我的拙劣解决方案:

grep -v -f <(for key in $(cut -d '=' -f 1 fileA); do echo "^$key="; done) fileB

grep-v-f非常感谢!我知道答案是“awk”,不幸的是我仍然无法正确使用它。它是如此强大…是的,它是强大的,但强大的工具使人懒惰。。。很高兴为您提供帮助。@Lucaborione您可以自由选择您认为最好的解决方案。但就我个人而言,我认为我的答案会比公认的答案更快/更好,尤其是对于大文件。join/sort/sort将启动3个进程,排序两次,连接一次。awk解决方案根本不需要排序。而且只有一个过程。无论如何,重要的是你在这里找到了解决方案。我刚刚结束了对给定解决方案的研究:乍一看,这似乎是个好主意,但它给我的真实数据带来了问题,因为我可以使用特殊字符和符号作为键,如“u”(awk没有问题),我还注意到使用大文件时在速度方面的差异。。所以谢谢你指出这一点!两次被接受:)@EdMorton你说得对,我没有注意到我写了一个[]=0美元。。。我想a[x]可能会在以后使用也许<代码>=$0
不需要。但是我只是把答案留在那里。+1但是我使用了选项
--nocheck order
而不是
sort
。我的
join
版本没有这个选项:
join(coreutils)5.2.1
啊,好的,我正在运行
GNU coreutils 8.15
。它工作得很好!谢谢我不习惯用“加入”谢谢你的教导你有关于你的文件的更具体的信息吗?当你说“巨大”,你有一个“大概”的数字吗?记录可能有多长?