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



我有两个列表

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

我想让list1 - list2返回一个像这样的新列表:

final=( "Sasha Tucker" "Virgil Mcdowell" )
<<p> 我尝试/strong>
final=($(comm -3 <(printf "%sn" "${list1[@]}" | sort) <(printf "%sn" "${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 '%sn' "${list2[@]}") <(printf '%sn' "${list1[@]}"))
# check resulting array
declare -p final
declare -a final=([0]="Sasha Tucker" [1]="Virgil Mcdowell")

:

  • printf '%sn' "${list2[@]}"在新行上打印数组中的每个项
  • <(printf '%sn' "${list2[@]}")是进程替换,将printf的输出视为文件
  • grep -vxFf file2 file1将发现file1中没有出现在file2中的条目。使用的选项是:x - exact match, v - inverse match, F - fixed string searchf - use file for input pattern

相关内容

  • 没有找到相关文章

最新更新