Làm thế nào để phân chia đầu ra và lưu trữ nó trong một mảng?


9

Đây là đầu ra:

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

Tôi đã thử với 2 kịch bản:

  1. Lưu trữ trong một mảng

      @arr=split(',',$stats);
      echo "statistics: $stats"
  2. Lưu trữ trong một biến

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

Nhưng không kịch bản nào hoạt động.


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]; }' HOẶC 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]; }' Điều này sẽ làm việc.

Câu trả lời:


9

Bạn có thể sử dụng một cái gì đó như thế này, cho một dòng đầu vào:

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

Bản giới thiệu:

$ 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

Tín dụng: Chia chuỗi dựa trên dấu phân cách trong bash? câu trả lời của Julian Schaub . Kiểm tra các câu trả lời khác ở đó quá.


2

Đoạn mã đầu tiên của bạn không có gì giống như cú pháp shell. Đó là cú pháp Perl chính xác.
Đoạn mã thứ hai của bạn không sử dụng cutđúng cách; Tôi không biết bạn dự định gì.

Shell có cấu trúc phân tách chuỗi tích hợp: khi bạn viết $somevarmà không có dấu ngoặc kép, trước tiên, shell sẽ tìm giá trị của biến somevar, sau đó chia giá trị đó thành các từ riêng biệt trên các ký tự được chỉ định bởi IFSvà cuối cùng diễn giải từng từ thành một khối mẫu (ký tự đại diện). Vì vậy, bạn có thể tách một chuỗi bằng cách đặt IFSthành ký tự dấu tách và tạm thời tắt tính năng tạo khối.

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

Lưu ý rằng nếu một trường chứa khoảng trắng, phần tử mảng sẽ giữ lại khoảng trắng đó. Nếu bạn muốn phân chia ở tất cả các khoảng trắng cũng như dấu phẩy, hãy đặt IFS=', '. Lưu ý rằng đó IFSkhông phải là một chuỗi để phân chia tại mà là một tập hợp các ký tự để phân chia tại; dấu cách hoặc dấu phẩy sẽ tạo thành dấu phân cách. Hơn nữa, có các quy tắc đặc biệt cho khoảng trắng: bất kỳ chuỗi 0 hoặc nhiều khoảng trắng nào được theo sau bởi dấu phẩy theo sau bằng 0 hoặc nhiều khoảng trắng sẽ tạo thành một dấu phân cách và bất kỳ chuỗi nào của một hoặc nhiều khoảng trắng cũng sẽ tạo thành một dấu phân cách.

Nếu bạn chỉ muốn loại bỏ khoảng trắng ở đầu hoặc cuối của một trường, bạn sẽ phải thực hiện theo từng phần tử.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.