如何获取 bash 列表中的唯一项目?

如何获取 bash 列表中的唯一项目?

如果我在 bash 中有一个列表

L="11 22 11 33 22 44"

有没有一种干净的方法可以到达“11 22 33 44”?

答案1

单程:

$ L="11 22 11 33 22 44"
$ L=$(echo $L | tr ' ' '\n' | sort -nu)    
$ echo $L
11 22 33 44

使用 tr,将数字分成单独的行,然后使用 sort 对数字进行排序(-n)并删除重复的数字(-u)。

答案2

其他一些编程语言中的常见模式是将每个值作为“键”存储在哈希、字典或关联数组中,并依靠实现来保持哈希键的唯一性。

declare -A items=()
for item in $L; do
    items[$item]=1
done
L=${!items[*]}

(不幸的是,该bash实现速度比 慢了约 2 倍sort -u。)

答案3

扩展上面的Gurus回答,如果你有一个数组,你可以:

$ L=(11 22 11 33 22 44)
$ echo ${L[@]}
11 22 11 33 22 44
$ L=($(echo ${L[@]} | tr ' ' '\n' | sort -nu))
$ echo ${L[@]}
11 22 33 44

答案4

eval我猜这个版本比其他版本都好!主要是因为bash 中不需要

$ L="11 22 11 33 22 44"
$ readarray -t L < <(printf "%s\n" ${L[@]} | sort -u)
$ printf "%s\n" ${L[@]}
11
22
33
44

相关内容