如何分割输出并将其存储在数组中?

如何分割输出并将其存储在数组中?

这是输出:

3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, h.264, 1029.1, 31, 31, 0,0,0.000000,31,31,0,0,0.000000,7,0,0,0.000000,30,1280 720,10,0,0,0.000000,30,1280 720

我尝试了两种情况:

  1. 存储在数组中

      @arr=split(',',$stats);
      echo "statistics: $stats"
    
  2. 存储在变量中

     echo $stats | cut -d ',' -f | read s1
     echo $s1
    

但这两种情况都不起作用。

答案1

对于单行输入,您可以使用类似这样的内容:

IFS="," read -ra arr <<< "$foo"

演示:

$ cat t.sh 
foo="3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, ..." # snipped

IFS="," read -ra arr <<< "$foo"
echo ${#arr[@]}
echo ${arr[0]}
echo ${arr[30]}
$ ./t.sh 
31
3
1280 720

学分:根据bash中的分隔符分割字符串?回答者约翰内斯·绍布。也检查那里的其他答案。

答案2

您的第一个片段与 shell 语法完全不同。这是正确的 Perl 语法。
您的第二个片段使用不cut正确;我不知道你的意图是什么。

shell 有一个内置的字符串拆分结构:当您在$somevar不带任何引号的情况下编写时,shell 首先查找变量 的值somevar,然后根据 指定的字符将该值拆分为单独的单词IFS,最后将每个单词解释为一个 glob模式(文件通配符)。因此,您可以通过设置IFS分隔符并暂时关闭通配符来分割字符串。

set -f; IFS=,
arr=($stats)
set +f; unset IFS

请注意,如果字段包含空格,则数组元素将保留该空格。如果您想分割所有空格和逗号,请设置IFS=', '。请注意,这IFS不是一个要分割的字符串,而是一组要分割的字符;空格或逗号将构成分隔符。此外,空白还有特殊的规则:任何由零个或多个空格组成的序列,后跟逗号,后跟零个或多个空格,将构成一个分隔符,并且任何由一个或多个空格组成的序列也将构成分隔符。

如果您只想删除字段开头或结尾处的空格,则必须逐个元素地执行此操作。

shopt -s extglob
for ((i=0; i<${#arr[@]}; i++)); do
  arr[i]=${arr[i]#+( )}   # strip one or more spaces at the beginning
  arr[i]=${arr[i]%+( )}   # strip one or more spaces at the end
done

答案3

$ set -f  # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc

相关内容