我有一个字符串列表,我想从另一个字符串的超集中删除这些字符串,而不是按任何特定顺序,从而构造一个新的集合。这在 Bash 中可行吗?
看起来您正在寻找运行时间优于 O(nm) 的东西,所以这里有一个答案。
Fgrep 或 grep -F 使用 Aho-Corasick 算法从固定字符串列表中生成单个 FSM,因此检查 SET2 中的每个单词需要 O(单词长度)时间。这意味着该脚本的整个运行时间为 O(n+m)。
(显然运行时间也取决于单词的长度)
[meatmanek@yggdrasil ~]$ cat subtract.sh
#!/bin/bash
subtract()
{
SET1=( $1 )
SET2=( $2 )
OLDIFS="$IFS"
IFS=$'\n'
SET3=( $(grep -Fxv "${SET1[*]}" <<< "${SET2[*]}") )
IFS="$OLDIFS"
echo "${SET3[*]}"
# SET3 = SET2-SET1
}
subtract "$@"
[meatmanek@yggdrasil ~]$ . subtract.sh
[meatmanek@yggdrasil ~]$ subtract "package-x86 test0 hello world" "computer hello sizeof compiler world package-x86 rocks"
computer sizeof compiler rocks
[meatmanek@yggdrasil ~]$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)