Compare/Difference of two arrays in bash -
is possible take difference of 2 arrays in bash.
great if suggest me way it.
code :
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 : array3=( "key7" "key8" "key9" "key10" )
appreciate help.
if strictly want array1 - array2
, then
$ array3=() $ in "${array1[@]}"; > skip= > j in "${array2[@]}"; > [[ $i == $j ]] && { skip=1; break; } > done > [[ -n $skip ]] || array3+=("$i") > done $ declare -p array3
runtime might improved associative arrays, wouldn't bother. if you're manipulating enough data matter, shell wrong tool.
for symmetric difference dennis's answer, existing tools comm
work, long massage input , output bit (since work on line-based files, not shell variables).
here, tell shell use newlines join array single string, , discard tabs when reading lines comm
array.
$ oldifs=$ifs ifs=$'\n\t' $ array3=($(comm -3 <(echo "${array1[*]}") <(echo "${array2[*]}"))) comm: file 1 not in sorted order $ ifs=$oldifs $ declare -p array3 declare -a array3='([0]="key7" [1]="key8" [2]="key9" [3]="key10")'
it complains because, lexographical sorting, key1 < … < key9 > key10
. since both input arrays sorted similarly, it's fine ignore warning. can use --nocheck-order
rid of warning, or add | sort -u
inside <(…)
process substitution if can't guarantee order&uniqueness of input arrays.
Comments
Post a Comment