Linux 如何在bash中仅在数组中存储唯一值?

Linux 如何在bash中仅在数组中存储唯一值?,linux,bash,ubuntu,Linux,Bash,Ubuntu,我正在寻找一种方法,从具有相似数字的不同名称的文件中提取数字,并在数组中仅存储唯一值,而不是重复值。例如,我有一些文件名,比如,12-fil1.txt,12-file2.txt,24-file1.txt,24-file2.txt。因此,我的数组将具有值array=(12,24)。如果这是一个愚蠢的问题,我深表歉意,但我对bash还不熟悉,因此我很难找到解决方法。您可以使用关联数组 declare -A chk declare -a uniques while read -r line; do

我正在寻找一种方法,从具有相似数字的不同名称的文件中提取数字,并在数组中仅存储唯一值,而不是重复值。例如,我有一些文件名,比如,
12-fil1.txt
12-file2.txt
24-file1.txt
24-file2.txt
。因此,我的数组将具有值
array=(12,24)
。如果这是一个愚蠢的问题,我深表歉意,但我对bash还不熟悉,因此我很难找到解决方法。

您可以使用关联数组

declare -A chk
declare -a uniques
while read -r line; do
  #do something with line or use multiple variables instead of line
  v="$(cut -d " " -f 1 <<< $line)"
  [[ ${chk[$v]} ]] || uniques+=("$v")
  chk[$v]=1
done < file.txt

declare -A array

for file in *.txt; { array[${file%-*}]=''; }
echo ${!array[@]}
declare-A chk
声明-唯一性
而read-r行;做
#使用line做一些事情,或者使用多个变量代替line

v=“$(cut-d”“-f1使用关联数组轻松完成

declare -A chk
declare -a uniques
while read -r line; do
  #do something with line or use multiple variables instead of line
  v="$(cut -d " " -f 1 <<< $line)"
  [[ ${chk[$v]} ]] || uniques+=("$v")
  chk[$v]=1
done < file.txt

declare -A array

for file in *.txt; { array[${file%-*}]=''; }
echo ${!array[@]}

更新。如果
declare-A array
被删除,那么我们得到了一个简单的索引数组,在这种情况下它也可以工作,因为我们只需要存储数字,但我们将它们存储为索引而不是数据。

将从文件名提取数字的输出传输到
sort-u
,并将其存储到数组中。您的意思是首先我应该停止重新设置数组中的所有值,然后使用
sort-u
仅从数组中获取唯一值?不,您从不存储所有值。您有一个类似
array=($(对于*.txt中的名称;do echo;done | sort-u))
的循环,只需注意,
对于y中的x;{…}
是x in y;do…;done
的一个未记录的快捷方式。我会坚持使用记录的表单,因为不能保证始终支持该快捷方式。谢谢!虽然输出也会给出字符,而不仅仅是数字。但是如果删除
声明-A数组
,我只会得到这正是我想要的。你知道为什么会这样吗?@JayS确实更新了我的答案。