如何解决如何在 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 match
、v - inverse match
、F - fixed string search
和f - use file for input pattern
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。