2016-06-30 3 views
3

У меня есть два списка:Получить только те элементы из списка х, которые не находятся в списке у

tagged=(a-01 a-02 a-03 a-04 a-06) 
merged=(a-01 a-02 a-05) 

Я ищу решение Баш печатать только те элементы, которые в tagged списке, но являются не в merged ((a-03 a-04 a-06)).

Я пытался перебирать оба списка, и я потерпел неудачу. Я твердо верю, что bash получил некоторый подлый способ решить эту проблему.

ответ

5

Вы можете использовать grep -vf с подменой процесса:

tagged=(a-01 a-02 a-03 a-04 a-06) 
merged=(a-01 a-02 a-05) 

grep -vf <(printf "%s\n" "${merged[@]}") <(printf "%s\n" "${tagged[@]}") 

a-03 
a-04 
a-06 

Чтобы сохранить результаты в массиве:

diffarr=($(grep -vf <(printf "%s\n" "${merged[@]}") <(printf "%s\n" "${tagged[@]}"))) 

declare -p diffarr 
declare -a diffarr='([0]="a-03" [1]="a-04" [2]="a-06")'