Jak podzielić dane wyjściowe i przechowywać je w tablicy?

9

To jest wynik:

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

Próbowałem z 2 scenariuszem:

  1. Przechowywanie w tablicy

      @arr=split(',',$stats);
      echo "statistics: $stats"
  2. Przechowywanie w zmiennej

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

Ale żaden scenariusz nie działa.

Maheshwari
źródło
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]; }' LUB 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]; }' To powinno działać.

Odpowiedzi:

9

Możesz użyć czegoś takiego do jednego wiersza danych wejściowych:

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

Próbny:

$ 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

Kredyty: Podział ciągu na podstawie ogranicznika w bash? odpowiedź Johannesa Schauba . Sprawdź także inne odpowiedzi tam.

Mata
źródło
2

Twój pierwszy fragment kodu nie przypomina składni powłoki. Jest to poprawna składnia Perla.
Twój drugi fragment nie działa cutpoprawnie; Nie wiem co zamierzałeś.

Powłoka ma wbudowaną konstrukcję rozdzielającą ciąg znaków: gdy piszesz $somevarbez cudzysłowów, powłoka najpierw sprawdza wartość zmiennej somevar, a następnie dzieli tę wartość na osobne słowa na znaki określone przez IFS, a na koniec interpretuje każde słowo jako glob wzorzec (plik wieloznaczny). Możesz podzielić łańcuch, ustawiając IFSznak separatora i tymczasowo wyłączając globowanie.

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

Zauważ, że jeśli pole zawiera spacje, element tablicy zachowa tę spację. Jeśli chcesz podzielić wszystkie białe znaki i przecinki, ustaw IFS=', '. Zauważ, że IFSnie jest to ciąg znaków do podziału, ale zestaw znaków do podziału; spacja lub przecinek będą stanowić separator. Ponadto istnieją specjalne zasady dotyczące białych znaków: dowolna sekwencja zerowa lub więcej spacji, po której następuje przecinek, po której następuje zero lub więcej spacji, będzie stanowić jeden separator, a każda sekwencja jednej lub więcej spacji również będzie stanowić separator.

Jeśli chcesz usunąć białe znaki tylko na początku lub na końcu pola, musisz to zrobić element po elemencie.

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
Gilles „SO- przestań być zły”
źródło
2
$ set -f  # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc
Kyle Jones
źródło
1
Pamiętaj, że będzie to traktować białe znaki jako separatory, a także przecinki.
Gilles 'SO - przestań być zły'