如何在 Bash 中减去这两个列表

How do I subtract these 2 list in Bash

我有 2 个列表

list1=( "Arwen Hagan" "Catriona Hutton" "Sasha Tucker" "Virgil Mcdowell" )
list2=( "Arwen Hagan" "Catriona Hutton" )

我想要 list1 - list2 到 return 这样的新列表:

final=( "Sasha Tucker" "Virgil Mcdowell" )

我的尝试

final=($(comm -3 <(printf "%s\n" "${list1[@]}" | sort) <(printf "%s\n" "${list2[@]}" | sort) | sort -n)) 
for val in "${listr[@]}"; do
  echo $val
done

输出

Sasha
Tucker
Virgil
Mcdowell

预期输出

Sasha Tucker
Virgil Mcdowell

你可以使用这一行mapfile + grep + printf解决方案:

mapfile -t final < <(grep -vxFf <(printf '%s\n' "${list2[@]}") <(printf '%s\n' "${list1[@]}"))

# check resulting array
declare -p final
declare -a final=([0]="Sasha Tucker" [1]="Virgil Mcdowell")

这里:

  • printf '%s\n' "${list2[@]}" 在新行打印数组中的每个项目
  • <(printf '%s\n' "${list2[@]}") 是进程替换,将 printf 的输出视为文件
  • grep -vxFf file2 file1 将在 file1 中找到 file2 中不存在的条目。使用的选项是:x - exact matchv - inverse matchF - fixed string searchf - use file for input pattern