首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取字符串列表的某些部分,并在列表中设置它们,不重复。

提取字符串列表的某些部分,并在列表中设置它们,不重复。
EN

Stack Overflow用户
提问于 2015-07-21 22:01:10
回答 3查看 49关注 0票数 1

我有一个文件名列表,我尝试提取sil..asc之间的索引,并将它们放在一个列表中,而我不想在列表中重复索引。以下是我的文件列表的一部分。

代码语言:javascript
复制
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

下面的代码是我做列表的尝试,但它不起作用

代码语言:javascript
复制
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[@]}

如有任何建议,将不胜感激。我的预期清单是:

代码语言:javascript
复制
16 7 8 3 14 5 6 16 4 13

最好是一份有序的名单。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-21 22:07:58

您可以在BASH 4中使用此脚本:

代码语言:javascript
复制
# 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中,使用

代码语言:javascript
复制
declare -a arr

for f in ellip*.asc; do
    f="${f/#*sil.}"
    f="${f%.asc}"
    arr+=("$f")
done

sort -un <(printf "%s\n" "${arr[@]}")

输出:

代码语言:javascript
复制
3
4
5
6
7
8
13
14
16
票数 2
EN

Stack Overflow用户

发布于 2015-07-21 23:14:35

我会用这样的方法

代码语言:javascript
复制
ls ellip*.asc | cut -f 6 -d . | sort -nu

cut程序在这里做您想做的事情,选择第6个字段作为.的分隔符。

票数 2
EN

Stack Overflow用户

发布于 2015-07-21 23:09:25

如果您不担心使用一些实用程序(您可能不担心,因为在您的示例中已经有了grepcutrev ),那么您可以在一个单独的工具中这样做:

代码语言:javascript
复制
arr=($(sed 's/ /\n/g' <<< $(echo *.sil.*.asc) |cut -d. -f6 |sort -n |uniq))

这将首先获得您的文件列表(请注意,您需要echo将您的文件列表输入到sed,因为路径名在<<<之后不会展开),将其拆分为行,选择第6个字段,将分隔符设置为.,然后从每个字段中选择一个uniqe值(注意uniq需要一个排序列表作为输入)。然后将此列表分配给一个数组。

还请注意,在您的示例中,您有:

代码语言:javascript
复制
...
for i in $(ls ellip*.asc)
do
...

这里解析ls的输出,通常应该避免请看这里。具体来说,在这种情况下,它可能是安全的,因为您的文件名有固定的格式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31550385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档