Bash:从变量

时间:2018-05-07 12:31:24

标签: bash

我有一个变量,其值如

"abc.def.ghi aa.bbb.ccc kk.lll.mmm ppp.qqq.lll"

以及具有值

的文件
kk.lll.mmm    
abc.def.ghi

我想从变量中删除这些值。文件和变量有一些相似但不相同的值。

1 个答案:

答案 0 :(得分:2)

如果您不关心排序,维护集合的最简洁方法之一是使用关联数组。这为您提供了O(1)检查或删除项目的能力 - 比sed

更好的表现
## Convert from a string to an array
str="abc.def.ghi aa.bbb.ccc kk.lll.mmm ppp.qqq.lll"
read -r -a array <<<"$str"

## ...and from there to an *associative* array
declare -A items=( )
for item in "${array[@]}"; do
  items[$item]=1
done

## ...whereafter you can remove items in O(1) time
while IFS= read -r line; do
  unset "items[$item]"
done <file

## Write list of remaining items
printf 'Remaining item: %q\n' "${!items[@]}"

顺便说一句,如果原始数据是以关联数组开头的话,可以跳过大部分代码:

# if the assignment looked like this, could just start at the "while read" loop.
declare -A items=( [abc.def.ghi]=1 [aa.bbb.ccc]=1 [kk.lll.mmm]=1 [ppp.qqq.lll]=1 )