bash存储变量数组中的唯一值

时间:2019-11-25 16:47:12

标签: bash

下面的bash进入一个文件夹,并将所有.html文件名的唯一值存储在f1中。然后,它将删除_$p之后的所有文本。我添加了一个for循环以获取$p中的唯一ID。终端显示$p是正确的,但是最后一个值仅存储在新数组($ sorted_unique_ids)中,我不确定为什么这三个都不正确。

dir=/path/to
  var=$(ls -td "$dir"/*/ | head -1)  ## sore newest <run> in var
for f1 in "$var"/qc/*.html ; do 
# Grab file prefix
  bname=`basename $f1` # strip of path
  p="$(echo $bname|cut -d_ -f1)"
    typeset -A myarray  ## define associative array
    myarray[${p}]=yes  ## store p in myarray
     for i in ${!myarray[@]}; do echo ${!myarray[@]} | tr ' ' '\n' | sort; done
done

输出

id1
id1
id1
id2
id1
id2
id1
id2
id3
id1
id2
id3

所需的sorted_unique_ids

id1
id2
id3

3 个答案:

答案 0 :(得分:1)

定义一个关联数组:

typeset -A myarray

使用每个p值作为数组元素的索引;将所需的任何值分配给数组元素(该值仅用作占位符):

myarray[${p}]=yes

如果您多次遇到相同的p值,则数组的每个分配都将覆盖之前的分配;最终结果是,数组中只有一个元素,其值为p

要获取p值的唯一列表,可以遍历数组的索引,例如:

for i in ${!myarray[@]}
do
    echo ${i}
done

如果您需要按排序顺序生成的数组索引,请尝试:

echo ${!myarray[@]} | tr ' ' '\n' | sort

然后,您可以根据需要使用排序后的结果集(例如,转储到标准输出,馈送至循环等)。


因此,将我的代码添加到OP的原始代码中将为我们提供:

typeset -A myarray  ## define associative array

dir=/path/to
var=$(ls -td "$dir"/*/ | head -1)  ## sore newest <run> in var
for f1 in "$var"/qc/*.html ; do 
  # Grab file prefix
  bname=`basename $f1` # strip of path
  p="$(echo $bname|cut -d_ -f1)"
  myarray[${p}]=yes  ## store p in myarray
done

# display sorted, unique set of p values
for i in ${!myarray[@]}; do echo ${!myarray[@]} | tr ' ' '\n' | sort; done

答案 1 :(得分:1)

latest=`ls -t "$dir"|head -1`    # or …|sed q` if you're really jonesing for keystrokes
for f in "$latest"/qc/*_*.html; do f=${f##*/}; printf %s\\n "${f%_*}"; done | sort -u

答案 2 :(得分:1)

也许是这样的:

dir=$(ls -td "$dir"/*/ | head -1)
find "$dir" -maxdepth 1 -type f -name '*_*.html' -printf "%f\n" |
cut -d_ -f1 | sort -u

对于创建的输入目录结构,如下所示:

dir=dir
mkdir -p dir/dir
touch dir/dir/id{1,2,3}_{a,b,c}.html

所以看起来像这样:

dir/dir/id2_b.html
dir/dir/id1_c.html
dir/dir/id2_c.html
dir/dir/id1_b.html
dir/dir/id3_b.html
dir/dir/id2_a.html
dir/dir/id3_a.html
dir/dir/id1_a.html
dir/dir/id3_c.html

脚本将输出:

id1
id2
id3

repl上进行了测试。