使用 bash 查找列表的重叠/交集

使用 bash 查找列表的重叠/交集

假设我有这两个“列表”:

#!/usr/bin/env bash

git fetch origin;

first_list=( );
second_list=( );

git branch --merged "remotes/origin/dev" | tr -d ' *' | while read branch; do
     first_list+=( "$branch" );
done


git branch --merged HEAD | tr -d ' *' | while read branch; do
     second_list+=( "$branch" );
done

我需要创建第三个列表,用于保存第一个列表和第二个列表中元素的交集。我怎样才能做到这一点?

答案1

使用关联数组作为帮助器来跟踪一个列表中的元素(作为键),然后快速检查另一个列表中的元素:

#!/bin/bash

list1=( 1 3 5 6 7 8 bumble bee )
list2=( 2 4 4 4 6 7 8 bee beer )

declare -A seen

for item in "${list1[@]}"; do
    seen[$item]=1
done

for item in "${list2[@]}"; do
    if [ -n "${seen[$item]}" ]; then
        intersection+=( "$item" )
    fi
done

echo 'Intersection:'
printf '\t%s\n' "${intersection[@]}"

这使用精确的字符串匹配来比较两个列表之间的元素。

结果:

Intersection:
    6
    7
    8
    bee

答案2

怎么样

for FN in ${first_list[@]}; do [[ ${second_list[@]} =~ $FN ]] && third_list+=($FN); done

相关内容