আউটপুটকে কীভাবে বিভক্ত করবেন এবং এটি অ্যারেতে সঞ্চয় করবেন?


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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.