2015-03-06 4 views
2

У меня есть два массива чисел, первый массив имеет все числа, а второй - подмножество первого, как я могу написать скрипт, чтобы найти недостающее число, которое существует в первом массиве, но не во втором массиве?сценарий оболочки сравнить два массива числа

Массив 1: [0, 1, 2, ..79] Массив 2: [1, 12, 33, 54,60, 71]

я гугл вокруг и пробовал различные подходы я нашел но ни один из них не работал

1.

declare -a array3 
for i in "${array1[@]}" 
    if [[ "${array2[@]}" =~ "$i" || "${array2[${#array2[@]}-1]}" == "$i" ]]; then 
    else 
     array3+=("$i") 
    fi 
done 

2.

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 

i m новый для скрипта bash, пожалуйста, помогите!

+0

ли элементы в каждом массиве отсортированные? Если это так, вам нужно запустить цикл с, например, индексом '$ i' для' array1' и '$ j' для' array2', и вы обнаружите, что '$ array1 [$ i]' меньше чем '$ array2 [$ j', или равный ему, или больше, чем он. Если число в '$ array1 [$ i]' меньше, напечатайте его и увеличьте '$ i'; если значения равны, увеличьте как '$ i', так и' $ j'; если он больше, увеличьте '$ j'. Остановитесь, когда вы достигнете конца любого массива. –

ответ

4

Один из способов получить дифференциальный массив использует comm:

array1=(0 1 2 3 4 5 6 7 8 9 10 11 12) 
array2=(0 1 3 4 6 7 10 12) 

comm -23 <(printf "%s\n" "${array1[@]}" | sort) <(printf "%s\n" "${array2[@]}" | sort) | sort -n 

2 
5 
8 
9 
11 
+1

спасибо! он работал так красиво! – user468587

+0

Добро пожаловать, рад, что все получилось. – anubhava

Смежные вопросы