可以在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。