วิธีการแยกเอาท์พุทและเก็บไว้ในอาร์เรย์?


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

คุณสามารถใช้บางสิ่งเช่นนี้สำหรับอินพุตบรรทัดเดียว:

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

เครดิต: แยกสตริงตามตัวคั่นในทุบตี? ตอบโดยโยฮันเน Schaub ตรวจสอบคำตอบอื่น ๆ ที่นั่นด้วย


2

ข้อมูลโค้ดแรกของคุณไม่เหมือนกับไวยากรณ์เชลล์ มันเป็นไวยากรณ์ Perl ที่ถูกต้อง
ตัวอย่างที่สองของคุณใช้ไม่cutถูกต้อง ฉันไม่รู้ว่าคุณตั้งใจจะทำอะไร

เชลล์มีโครงสร้างการแยกสตริงในตัว: เมื่อคุณเขียน$somevarโดยไม่ต้องใส่เครื่องหมายอัญประกาศเชลล์จะค้นหาค่าของตัวแปรsomevarก่อนจากนั้นจึงแยกค่านั้นเป็นคำแยกต่างหากบนอักขระที่ระบุโดยIFSและตีความแต่ละคำว่าเป็นแบบกลม รูปแบบ (ไฟล์ไวด์การ์ด) ดังนั้นคุณสามารถแยกสตริงโดยการตั้งค่า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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.