仅获取列表x中不在列表y中的那些元素

Kac*_*per 3 bash

我有两个清单:

tagged=(a-01 a-02 a-03 a-04 a-06)
merged=(a-01 a-02 a-05)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个bash解决方案,只打印tagged列表中但不在merged((a-03 a-04 a-06))中的那些元素.

我一直试图迭代这两个列表,但我失败了.我坚信bash有一些偷偷摸摸的方式来解决它.

anu*_*ava 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
Run Code Online (Sandbox Code Playgroud)

要将结果存储在数组中:

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")'
Run Code Online (Sandbox Code Playgroud)