【发布时间】:2018-05-12 05:15:54
【问题描述】:
我正在编写一个 Korn shell 脚本。我有两个数组(比如arr1 和arr2),都包含字符串,我需要检查arr2 中存在arr1 中的哪些元素(作为整个字符串或子字符串)。最直观的解决方案是嵌套for循环,并检查arr1中的每个元素是否可以在arr2(通过grep)中找到,如下所示:
for arr1Element in ${arr1[*]}; do
for arr2Element in ${arr2[*]}; do
# using grep to check if arr1Element is present in arr2Element
echo $arr2Element | grep $arr1Element
done
done
问题是arr2 有大约 3000 个元素,因此运行嵌套循环需要很长时间。我想知道在 Bash 中是否有更好的方法来做到这一点。
如果我在 Java 中执行此操作,我可以计算其中一个数组中元素的哈希值,然后在另一个数组中查找这些哈希值,但我认为 Bash 没有任何功能可以执行此类操作(除非我愿意在 Bash 中编写哈希计算函数)。
有什么建议吗?
【问题讨论】:
-
我不确定我是否理解您使用哈希的 Java 解决方案将如何处理子字符串。也许你应该添加一些伪代码来澄清一下?
-
@slim 你是对的 - 它不会处理子字符串,只处理完全匹配。我添加该部分只是为了看看是否有人可以在 bash 中提出等效的解决方案(用于精确匹配)。
-
顺便说一句,使用
"${arr1[@]}",而不是${arr1[*]}。后者拆分单词、扩展 glob 并做各种其他不受欢迎的事情。 -
which ksh 很重要。例如,并非所有广泛使用的 ksh 版本都支持关联数组,因此基于它们的解决方案可能无法转换(除非您使用的是正确的 David Korn ksh93 ——如果您是,那就太好了)。
-
顺便说一句,
echo foo | grep bar比[[ foo = *bar* ]]慢大大。在这里,您根本不需要这样做。