如果我在 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