bash中的两个数组的比较/差异

前端之家收集整理的这篇文章主要介绍了bash中的两个数组的比较/差异前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
可以在bash中取两个数组的差异。
如果你能建议我这样做的方式真的很棒。

代码

Array1=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" )
Array2=( "key1" "key2" "key3" "key4" "key5" "key6" ) 

Array3 =diff(Array1,Array2)

Array3 ideally should be :
Array3=( "key7" "key8" "key9" "key10" )

感谢你的帮助。

如果您严格地要求Array1 – Array2,那么
$ Array3=()
$ for i in "${Array1[@]}"; do
> skip=
> for j in "${Array2[@]}"; do
> [[ $i == $j ]] && { skip=1; break; }
> done
> [[ -n $skip ]] || Array3+=("$i")
> done
$ declare -p Array3

运行时可能会通过关联数组来改进,但是我个人不会打扰。如果您正在操作足够的数据来解决问题,那么shell是错误的工具。

对于像丹尼斯答案这样的对称差异,现有的工具,如comm工作,只要我们按压输入和输出(因为它们在线上的文件上工作,而不是shell变量)。

在这里,我们告诉shell使用换行符将数组加入到一个字符串中,并在从comm返回数组中读取行时放弃选项卡。

$ oldIFS=$IFS IFS=$'\n\t'
$ Array3=($(comm -3 <(echo "${Array1[*]}") <(echo "${Array2[*]}")))
comm: file 1 is not in sorted order
$ IFS=$oldIFS
$ declare -p Array3
declare -a Array3='([0]="key7" [1]="key8" [2]="key9" [3]="key10")'

它抱怨,因为通过词法排序,key1< ...< key9> key10。但是由于两个输入数组都是类似的排序,忽略该警告是很好的。您可以使用–nocheck-order来摆脱警告,或添加一个|如果不能保证输入数组的顺序和唯一性,则在<()过程替换中排序-u。

猜你在找的Bash相关文章