आउटपुट को कैसे विभाजित करें और इसे एक ऐरे में स्टोर करें?


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

क्रेडिट: स्प्लिट स्ट्रिंग बैश में सीमांकक के आधार पर? जोहानस शाउब द्वारा उत्तर । वहां भी अन्य उत्तरों की जांच करें।


2

आपका पहला स्निपेट शेल सिंटैक्स जैसा कुछ नहीं है। यह पेरल सिंटैक्स सही है।
आपका दूसरा स्निपेट 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.