微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有 2 个列表

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

我希望 list1 - list2 返回这样的新列表:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。