下面的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
答案 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上进行了测试。