加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 19:37:15 所属栏目:安全 来源:网络整理
导读:可以在bash中取两个数组的差异。 如果你能建议我这样做的方式真的很棒。 代码: Array1=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" )Array2=( "key1" "key2" "key3" "key4" "key5" "key6" ) Array3 =diff(Array1,Array2)Arr
可以在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=$'nt'
$ 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。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读