চর্মসার
jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[] | @csv'
বা:
jq -r '(.[0] | keys_unsorted) as $keys | ([$keys] + map([.[ $keys[] ]])) [] | @csv'
বিস্তারিত
পাশে
বিশদটি বর্ণনা করা জটিল কারণ জেকিউ স্ট্রিম-ওরিয়েন্টড, এর অর্থ এটি কোনও একক মানের পরিবর্তে জেএসওএন ডেটার ক্রমিকায় কাজ করে। ইনপুট জেএসএন স্ট্রিমটি কিছু অভ্যন্তরীণ প্রকারে রূপান্তরিত হয় যা ফিল্টারগুলির মধ্য দিয়ে যায় এবং তারপরে প্রোগ্রামের শেষে একটি আউটপুট স্ট্রিমে এনকোড হয়। অভ্যন্তরীণ প্রকারটি JSON দ্বারা মডেলিং হয় না এবং নামযুক্ত ধরণের হিসাবে উপস্থিত হয় না। এটি একটি বেয়ার ইনডেক্স ( .[]) বা কমা অপারেটরের আউটপুট পরীক্ষা করে খুব সহজেই প্রদর্শিত হয় (এটি সরাসরি পরীক্ষা করা কোনও ডিবাগারের সাহায্যে করা যেতে পারে, তবে এটি জেএসএন-এর পিছনে ধারণাগত ডেটা ধরণের পরিবর্তে জেউ-র অভ্যন্তরীণ ডেটা ধরণের ক্ষেত্রে হতে পারে) ।
$ jq -c '। []' <<< '["ক", "খ"]'
"ক"
"খ"
$ jq -cn '"এ", "বি"'
"ক"
"খ"
দ্রষ্টব্য যে আউটপুট কোনও অ্যারে নয় (যা হবে ["a", "b"])। কমপ্যাক্ট আউটপুট ( -cবিকল্প) দেখায় যে প্রতিটি অ্যারে উপাদান (বা ,ফিল্টারের সাথে যুক্তি ) আউটপুটে একটি পৃথক বস্তুতে পরিণত হয় (প্রত্যেকে পৃথক লাইনে থাকে)।
একটি স্ট্রীম একটি মত হল তাদেরকে JSON-SeQ , বরং তুলনায় নতুন লাইন ব্যবহার আরএস যখন এনকোড একটি আউটপুট বিভাজক হিসাবে। ফলস্বরূপ, এই অভ্যন্তরীণ ধরণটি জেনেরিক শব্দটি "উত্তর" এর সাথে উত্তরটিতে এনকোডড ইনপুট এবং আউটপুট জন্য "স্ট্রিম" দিয়ে সংরক্ষণ করা হয়।
ফিল্টার নির্মাণ
প্রথম অবজেক্টের কীগুলি এর সাথে বের করা যেতে পারে:
.[0] | keys_unsorted
কীগুলি সাধারণত তাদের মূল ক্রমে রাখা হবে তবে সঠিক ক্রম সংরক্ষণের নিশ্চয়তা নেই। ফলস্বরূপ, একই ক্রমে মানগুলি পেতে সেগুলিকে সূচকগুলি ব্যবহার করতে হবে to যদি কিছু বস্তুর আলাদা কী অর্ডার থাকে তবে এটি ভুল কলামগুলিতে থাকা মানগুলিও প্রতিরোধ করবে।
উভয়কে প্রথম সারির হিসাবে কীগুলি আউটপুট দেওয়ার জন্য এবং এগুলি সূচীকরণের জন্য উপলব্ধ করার জন্য, তারা একটি ভেরিয়েবলে সংরক্ষণ করা হয়। পাইপলাইনের পরবর্তী পর্যায়ে তারপরে এই পরিবর্তনশীলটিকে উল্লেখ করে এবং আউটপুট প্রবাহে শিরোনামটি প্রিপেন্ড করতে কমা অপারেটর ব্যবহার করে।
(.[0] | keys_unsorted) as $keys | $keys, ...
কমা পরে অভিব্যক্তি একটু জড়িত। কোনও বস্তুর সূচক অপারেটর স্ট্রিংগুলির ক্রম নিতে পারে (উদাহরণস্বরূপ "name", "value"), সেই স্ট্রিংগুলির জন্য সম্পত্তি মানগুলির ক্রম ফিরিয়ে আনতে পারে। $keysএকটি অ্যারে, ক্রম নয়, সুতরাং []এটি একটি অনুক্রমে রূপান্তর করতে প্রয়োগ করা হয়,
$keys[]
যা পরে পাস করা যেতে পারে .[]
.[ $keys[] ]
এটিও একটি সিক্যুয়েন্স তৈরি করে, সুতরাং অ্যারে কনস্ট্রাক্টর এটি অ্যারে রূপান্তর করতে ব্যবহৃত হয়।
[.[ $keys[] ]]
এই অভিব্যক্তিটি একটি একক বস্তুর জন্য প্রয়োগ করতে হবে। map()এটি বাইরের অ্যারেতে সমস্ত বস্তুর জন্য প্রয়োগ করতে ব্যবহৃত হয়:
map([.[ $keys[] ]])
শেষ পর্যন্ত এই পর্যায়ে, এটি একটি অনুক্রমে রূপান্তরিত হয় যাতে প্রতিটি আইটেম আউটপুটে একটি পৃথক সারিতে পরিণত হয়।
map([.[ $keys[] ]])[]
সিক্যুয়েন্সটি কেন mapএটির বাইরে আনব্যান্ডল করার জন্য কেবল বিন্যাসে অ্যারেতে বান্ডিল করবেন ? mapএকটি অ্যারে উত্পাদন করে; .[ $keys[] ]একটি ক্রম উত্পাদন করে। mapসিকোয়েন্স থেকে প্রয়োগ করা হলে .[ $keys[] ]মানগুলির ক্রমগুলির একটি অ্যারে তৈরি হবে, তবে যেহেতু অনুক্রমগুলি কোনও JSON প্রকার নয়, সুতরাং পরিবর্তে আপনি সমস্ত মান সমেত একটি সমতল অ্যারে পাবেন।
["NSW","AU","state","New South Wales","AB","CA","province","Alberta","ABD","GB","council area","Aberdeenshire","AK","US","state","Alaska"]
প্রতিটি বস্তুর মানগুলি পৃথক করে রাখা দরকার, যাতে তারা চূড়ান্ত আউটপুটে পৃথক সারি হয়ে যায়।
অবশেষে, সিকোয়েন্সটি @csvফর্ম্যাটারের মাধ্যমে পাস করা হয় ।
বিকল্প
আইটেমগুলি প্রথম চেয়ে বরং দেরিতে পৃথক করা যায়। সিকোয়েন্স পেতে কমা অপারেটরটি ব্যবহার করার পরিবর্তে (ডান অপারেণ্ড হিসাবে একটি অনুক্রম পাস করা) শিরোনাম সিকোয়েন্স ( $keys) একটি অ্যারেতে আবৃত হতে পারে এবং +মানগুলির অ্যারে সংযোজন করতে ব্যবহৃত হয়। এখনও পাস হওয়ার আগে একটা ক্রম রূপান্তরিত করার জন্য দরকার @csv।
json2csvহয় stackoverflow.com/questions/57242240/...