出力を分割して配列に格納する方法は?


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]; }' これでうまくいくはずです。

回答:


9

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

最初のスニペットは、シェル構文に似ています。これは正しいPerl構文です。
2番目のスニペットはcut正しく使用されません。あなたの意図がわかりません。

シェルには組み込みの文字列分割構造があります。$somevar引用符なしで書き込むと、シェルは最初に変数の値を検索しsomevar、次にその値をで指定された文字で別々の単語に分割しIFS、最後に各単語をグロブとして解釈しますパターン(ファイルワイルドカード)。したがってIFS、区切り文字を設定して一時的にグロビングをオフにすることで、文字列を分割できます。

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

フィールドに空白が含まれている場合、配列要素はその空白を保持することに注意してください。すべての空白とカンマで分割する場合は、を設定しIFS=', 'ます。IFSは分割する文字列ではなく、分割する文字のセットであることに注意してください。スペースまたはコンマのいずれかがセパレーターを構成します。さらに、空白には特別な規則があります。0個以上のスペースとそれに続くコンマと0個以上のスペースのシーケンスは1つのセパレータを構成し、1つ以上のスペースのシーケンスもセパレータを構成します。

フィールドの最初または最後の空白のみを削除する場合は、要素ごとに行う必要があります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.