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


9

这是输出:

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

我尝试了2种情况:

  1. 存储在阵列中

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

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

但是,两种情况都不起作用。


awk '{ split("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 ",arr,","); print arr[1]; }'echo "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" | awk '{ split($0,arr,","); print arr[1]; }' 这应该工作。

Answers:


9

您可以在单行输入中使用如下所示的内容:

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中的分隔符拆分字符串?Johannes Schaub的回答。在那里也检查其他答案。


2

您的第一个代码片段类似于shell语法。这是正确的Perl语法。
您的第二个片段未cut正确使用;我不知道你打算做什么

外壳程序具有内置的字符串拆分构造:当您编写时$somevar不带引号时,外壳程序首先查找变量的值somevar,然后将该值拆分为所指定字符上的单独单词IFS,最后将每个单词解释为glob模式(文件通配符)。因此,可以通过设置IFS为分隔符并暂时关闭globbing 来分割字符串。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.