Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 提取字符串列表的某些部分,并在列表中设置它们,而不重复_Linux_Bash_List - Fatal编程技术网

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

Linux 提取字符串列表的某些部分,并在列表中设置它们,而不重复,linux,bash,list,Linux,Bash,List,我有一个文件名列表,我试图提取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 elli

我有一个文件名列表,我试图提取
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

最好是一个排序列表。

您可以在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[@]}")

您可以在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[@]}")

如果您不担心使用某些实用程序(您可能不担心,因为您的示例中已经有了
grep
cut
rev
),那么您可以在一行程序中执行此操作:

arr=($(sed 's/ /\n/g' <<< $(echo *.sil.*.asc) |cut -d. -f6 |sort -n |uniq))

在这里,您分析了
ls
的输出,您通常应该避免这样做。特别是在这种情况下,它可能是安全的,因为您的文件名具有固定格式。

如果您不担心使用某些实用程序(您可能不担心,因为您的示例中已经有了
grep
cut
rev
),那么您可以在一行程序中执行此操作:

arr=($(sed 's/ /\n/g' <<< $(echo *.sil.*.asc) |cut -d. -f6 |sort -n |uniq))

在这里,您分析了
ls
的输出,您通常应该避免这样做。特别是在这种情况下,它可能是安全的,因为您的文件名具有固定格式

ls ellip*.asc | cut -f 6 -d . | sort -nu

cut
程序在这里执行您想要的操作,选择第6个字段,用

的分隔符分隔

ls ellip*.asc | cut -f 6 -d . | sort -nu

cut
程序在这里做的正是你想要的,选择第6个字段,用

的分隔符分隔,你能解释一下
f=“${f/\*sil.}”和
f=“${f%.asc}”如何帮助分割字符串吗?因为当我尝试获取
apo.
sil
之间的数字时,它没有返回正确的值。
f=“${f/#*sil.}”
从开始到
sil删除所有内容。
f=“${f%.asc}”
最终删除
.asc
。我完全按照你的问题创建了所有文件,两个脚本在我的测试中都运行良好。我还想得到
apo.
.sil
之间的数字,但它不能改变一点你的解决方案。我想知道你为什么设置
arr[“$f”]=1
arr[“$f”]=1
正在数组
arr
中存储这些索引。你可以运行
unset-arr;声明-arr;对于ellip*.asc中的f;不要呼应“;f=“${f/#*sil.}”;f=“${f%.asc}”;arr[“$f”]=1;完成
并告诉我您在终端上看到了什么。我在不同的行中看到
等。它确实返回了您编写的内容,而且当我运行echo
${arr[@]}
时,它返回了错误的答案。您能解释一下
f=“${f/#sil.}”和
f=“${f%.asc}”如何帮助拆分字符串吗?因为当我尝试获取
apo.
sil
之间的数字时,它没有返回正确的值。
f=“${f/#*sil.}”
从开始到
sil删除所有内容。
f=“${f%.asc}”
最终删除
.asc
。我完全按照你的问题创建了所有文件,两个脚本在我的测试中都运行良好。我还想得到
apo.
.sil
之间的数字,但它不能改变一点你的解决方案。我想知道你为什么设置
arr[“$f”]=1
arr[“$f”]=1
正在数组
arr
中存储这些索引。你可以运行
unset-arr;声明-arr;对于ellip*.asc中的f;不要呼应“;f=“${f/#*sil.}”;f=“${f%.asc}”;arr[“$f”]=1;完成
并告诉我您在终端上看到了什么。我在不同的行中看到
等。它确实返回您编写的内容,而且当我运行echo
${arr[@]}
时,它返回错误的答案。我如何将您答案的输出放入数组中?您必须询问其他人--我不知道shell数组!我还认为要求提取sil之间的索引。假设第六个字段是索引可能并不安全。除了解析
ls
输出可能容易出错之外,我认为它的工作原理是这样的
arr=($(ls ellip*.asc | cut-f 6-d.| sort-nu))
。我如何将您答案的输出放入数组中?您必须询问其他人——我不知道shell数组!我还认为要求提取sil之间的索引。假设第六个字段是索引可能并不安全。除了解析
ls
输出可能容易出错之外,我认为它的工作原理如下
arr=($(ls ellip*.asc | cut-f 6-d.| sort-nu))