我有一个文件名列表,我尝试提取sil.和.asc之间的索引,并将它们放在一个列表中,而我不想在列表中重复索引。以下是我的文件列表的一部分。
ellip5.0.apo.3.sil.16.asc
ellip5.0.apo.3.sil.7.asc
ellip5.0.apo.3.sil.8.asc
ellip5.0.apo.4.sil.3.asc
ellip5.0.apo.4.sil.14.asc
ellip5.0.apo.4.sil.5.asc
ellip5.0.apo.4.sil.6.asc
ellip5.0.apo.4.sil.7.asc
ellip5.0.apo.4.sil.8.asc
ellip5.0.apo.5.sil.3.asc
ellip5.0.apo.5.sil.14.asc
ellip5.0.apo.5.sil.5.asc
ellip5.0.apo.5.sil.6.asc
ellip5.0.apo.5.sil.7.asc
ellip5.0.apo.5.sil.8.asc
ellip5.0.apo.6.sil.3.asc
ellip5.0.apo.6.sil.4.asc
ellip5.0.apo.6.sil.5.asc
ellip5.0.apo.6.sil.16.asc
ellip5.0.apo.6.sil.7.asc
ellip5.0.apo.6.sil.8.asc
ellip5.0.apo.7.sil.13.asc
ellip5.0.apo.7.sil.4.asc
ellip5.0.apo.7.sil.5.asc下面的代码是我做列表的尝试,但它不起作用
args=()
containsElement () {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
for MYVAR in "ellip*.asc"
j=0
for i in $(ls ellip*.asc)
do
INDEX=`echo $i | grep -oE 'sil.[^/]+.asc' | cut -c5- | rev | cut -c5- | rev`
listcontains INDEX "${args[@]}"
if [ $? == 1 ];then
args[j]=$INDEX
j=$(($j + 1))
echo $INDEX
fi
done
echo ${args[@]}如有任何建议,将不胜感激。我的预期清单是:
16 7 8 3 14 5 6 16 4 13最好是一份有序的名单。
发布于 2015-07-21 22:07:58
您可以在BASH 4中使用此脚本:
# declare an associative array
declare -A arr
for f in ellip*.asc; do
f="${f/#*sil.}"
f="${f%.asc}"
arr["$f"]=1
done
# print sorted index values
printf "%s\n" "${!arr[@]}" | sort -n
3
4
5
6
7
8
13
14
16在不支持关联数组的旧BASH中,使用:
declare -a arr
for f in ellip*.asc; do
f="${f/#*sil.}"
f="${f%.asc}"
arr+=("$f")
done
sort -un <(printf "%s\n" "${arr[@]}")输出:
3
4
5
6
7
8
13
14
16发布于 2015-07-21 23:14:35
我会用这样的方法
ls ellip*.asc | cut -f 6 -d . | sort -nucut程序在这里做您想做的事情,选择第6个字段作为.的分隔符。
发布于 2015-07-21 23:09:25
如果您不担心使用一些实用程序(您可能不担心,因为在您的示例中已经有了grep、cut和rev ),那么您可以在一个单独的工具中这样做:
arr=($(sed 's/ /\n/g' <<< $(echo *.sil.*.asc) |cut -d. -f6 |sort -n |uniq))这将首先获得您的文件列表(请注意,您需要echo将您的文件列表输入到sed,因为路径名在<<<之后不会展开),将其拆分为行,选择第6个字段,将分隔符设置为.,然后从每个字段中选择一个uniqe值(注意uniq需要一个排序列表作为输入)。然后将此列表分配给一个数组。
还请注意,在您的示例中,您有:
...
for i in $(ls ellip*.asc)
do
...这里解析ls的输出,通常应该避免请看这里。具体来说,在这种情况下,它可能是安全的,因为您的文件名有固定的格式。
https://stackoverflow.com/questions/31550385
复制相似问题