Bash 数组比较

Bash 数组比较

在 bash 脚本中,我正在构建两个动态数组。我想构造另一个相差两个的数组。

例子:

array1=("aa-1234|safsf|sfsfs" "aa-2345|sfsfs|n0sfm" "aa-0890|ssfsf|sfss" "aa-8097|fsfsf|fsfs" "bb-1234|xvxx|xvxv" "cc-1234|jmsf|sfsfs" "cc-1235|xvxv|xvxv")
array2=(aa-1234 aa-8097)

array1 元素是长条目,|每个条目都作为分隔符。

现在我想构造一个array3,它的元素除了array2中匹配的之外都是array1的。

我尝试了一个for循环来跳过元素。然而 array1 很长,需要花费太多时间。我正在寻找一种更有效的方法。

答案1

我将从第二个数组构造一个正则表达式,然后将第一个数组的元素与它进行比较:

$ re=$(IFS='|'; echo "^(${array2[*]})\|")
$ echo "$re"
^(aa-1234|aa-8097)\|
$ for elem in "${array1[@]}"; do if [[ $elem =~ $re ]]; then array3+=("$elem"); fi; done
$ printf "%s\n" "${array3[@]}"
aa-1234|safsf|sfsfs
aa-8097|fsfsf|fsfs

如果数组比显示的大得多,我会将练习分配给grep

$ grep -Ff <(printf "%s\n" "${array2[@]}") <(printf "%s\n" "${array1[@]}")
aa-1234|safsf|sfsfs
aa-8097|fsfsf|fsfs

相关内容