我有两个列表
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 search
和f - use file for input pattern