如何在 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 match
、v - inverse match
、F - fixed string search
和 f - use file for input pattern
我有 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 match
、v - inverse match
、F - fixed string search
和f - use file for input pattern