জেকিউ ব্যবহার করে 2 ফাইল থেকে 2 জেএসওএন অবজেক্টকে কীভাবে মার্জ করবেন?


123

আমি জেসনকে পার্স করতে শেল স্ক্রিপ্টে জেকিউ সরঞ্জামগুলি (জেকি-জসন-প্রসেসর) ব্যবহার করছি ।

আমার কাছে ২ টি জসন ফাইল রয়েছে এবং সেগুলি একটি অনন্য ফাইলে মিশতে চাই

ফাইলগুলির বিষয়বস্তু এখানে:

file1

{
    "value1": 200,
    "timestamp": 1382461861,
    "value": {
        "aaa": {
            "value1": "v1",
            "value2": "v2"
        },
        "bbb": {
            "value1": "v1",
            "value2": "v2"
        },
        "ccc": {
            "value1": "v1",
            "value2": "v2"
        }
    }
}

file2

{
    "status": 200,
    "timestamp": 1382461861,
    "value": {
        "aaa": {
            "value3": "v3",
            "value4": 4
        },
        "bbb": {
            "value3": "v3"
        },      
        "ddd": {
            "value3": "v3",
            "value4": 4
        }
    }
}

প্রত্যাশিত ফলাফল

{
    "value": {
        "aaa": {
            "value1": "v1",
            "value2": "v2",
            "value3": "v3",
            "value4": 4
        },
        "bbb": {
            "value1": "v1",
            "value2": "v2",
            "value3": "v3"
        },
        "ccc": {
            "value1": "v1",
            "value2": "v2"
        },
        "ddd": {
            "value3": "v3",
            "value4": 4
        }
    }
}

আমি প্রচুর সংমিশ্রণ চেষ্টা করি তবে কেবলমাত্র আমি প্রাপ্ত ফলাফলটি নিম্নলিখিতটি হয়, যা প্রত্যাশিত ফলাফল নয়:

{
  "ccc": {
    "value2": "v2",
    "value1": "v1"
  },
  "bbb": {
    "value2": "v2",
    "value1": "v1"
  },
  "aaa": {
    "value2": "v2",
    "value1": "v1"
  }
}
{
  "ddd": {
    "value4": 4,
    "value3": "v3"
  },
  "bbb": {
    "value3": "v3"
  },
  "aaa": {
    "value4": 4,
    "value3": "v3"
  }
}

এই আদেশটি ব্যবহার করে:

jq -s '.[].value' file1 file2

1
আপনি jsontool চেষ্টা করেছেন? github.com/trentm/json
— Nano Taboada

এখনও না, আমি একবার দেখে নেব। ধন্যবা
— Janfy

jsonব্যবহারের সাথে এটি করতে:cat f1 f2 | json --deep-merge
— xer0x

আপনি কোথায় / কীভাবে json@ xer0x পাবেন?
— গস

@Gus উহু, পেতে jsonকরার টুল চলতে চলতে github.com/trentm/json
— xer0x

উত্তর:


154

1.4 যেহেতু এটি এখন *অপারেটরের মাধ্যমে সম্ভব । যখন দুটি বস্তু দেওয়া হয়, এটি তাদের পুনরাবৃত্তিতে মার্জ করবে। উদাহরণ স্বরূপ,

jq -s '.[0] * .[1]' file1 file2

গুরুত্বপূর্ণ: -s (--slurp)পতাকাটি নোট করুন , যা একই অ্যারেগুলিতে ফাইল রাখে।

আপনি পাবেন:

{
  "value1": 200,
  "timestamp": 1382461861,
  "value": {
    "aaa": {
      "value1": "v1",
      "value2": "v2",
      "value3": "v3",
      "value4": 4
    },
    "bbb": {
      "value1": "v1",
      "value2": "v2",
      "value3": "v3"
    },
    "ccc": {
      "value1": "v1",
      "value2": "v2"
    },
    "ddd": {
      "value3": "v3",
      "value4": 4
    }
  },
  "status": 200
}

আপনি যদি অন্য কীগুলি (যেমন আপনার প্রত্যাশিত ফলাফলের মতো) থেকে মুক্তি পেতে চান তবে এটি করার একটি উপায় হ'ল:

jq -s '.[0] * .[1] | {value: .value}' file1 file2

বা সম্ভবত কিছুটা দক্ষ (কারণ এটি অন্য কোনও মানকে একীভূত করে না):

jq -s '.[0].value * .[1].value | {value: .}' file1 file2

2
দ্রষ্টব্য : -sপতাকাটি গুরুত্বপূর্ণ যেমন এটি ছাড়া দুটি বস্তু অ্যারেতে নেই।
— জন মোরালেস

1
@ সিমোকিনুনেন এখানে আমরা দুটি জেসন ফাইল একত্রিত করছি। 1 জসন ভেরিয়েবল এবং অন্যান্য জসন ফাইল থাকা কি সম্ভব? আমি চেষ্টা করেছি কিন্তু মনে হচ্ছে এটি আমার পক্ষে কাজ করছে না!
— জয়েশ ধন্ধা

যদি পৃথক ফাইলগুলি একটি কী দ্বারা বাছাই করা হয় তবে ফলস্বরূপ ফাইলে অর্ডার সংরক্ষণ করা কি সম্ভব?
— লিও

@ সিমোকিনুনেন আমি এই কমান্ডটি ব্যবহার করছি: "jq -s 'add' config.json other / *। Json" তবে আমি যখন "বিড়াল কনফিগারেশন.জসন" করি তবে এটি একীভূত হয় না। কীভাবে আমি আউটপুটটিকে ফাইলে রাখতে পারি?
— রেনাটো বিবিয়ানো

63

ব্যবহার jq -s add:

$ echo '{"a":"foo","b":"bar"} {"c":"baz","a":0}' | jq -s add
{
  "a": 0,
  "b": "bar",
  "c": "baz"
}

এটি স্টিডিন থেকে সমস্ত জেএসএন পাঠ্যকে একটি অ্যারেতে পাঠ jq -sকরে ( তা করে) তবে এটি তাদের "হ্রাস" করে।

( addহিসাবে সংজ্ঞায়িত করা হয় def add: reduce .[] as $x (null; . + $x);, যা ইনপুট অ্যারের / অবজেক্টের মানগুলির উপরে পুনরাবৃত্তি করে এবং সেগুলি যুক্ত করে Ob অবজেক্ট সংযোজন == মার্জ করুন))


4
এই পদ্ধতির সাথে পুনরাবৃত্ত মার্জ (* অপারেটর) করা কি সম্ভব?
— ডেভ ফস্টার 19

1
@ ডেভফোস্টার হ্যাঁ, এরকম কিছু সহ reduce .[] as $x ({}; . * $x)- জ্রিবের উত্তরও দেখুন ।
— চ্রিকি

এটি আমাকে জবাব এবং জকিউ ব্যবহার করে দুটি জেসন ফাইলগুলিকে একীভূত করতে সহায়তা করেছে। ধন্যবাদ।
— ফিলিপ আলভারেজ

35

আপনার এখনও এটি প্রয়োজন কিনা কে জানে তবে সমাধানটি এখানে।

একবার আপনি --slurpবিকল্পটি পেয়ে গেলে এটি সহজ!

--slurp/-s:
    Instead of running the filter for each JSON object in the input,
    read the entire input stream into a large array and run the filter just once.

তারপরে +অপারেটর আপনি যা চান তা করবে:

jq -s '.[0] + .[1]' config.json config-user.json

(দ্রষ্টব্য: আপনি যদি ডান ফাইলের সাথে বাম ফাইলগুলি ওভাররাইটের পরিবর্তে অভ্যন্তরীণ বস্তুগুলিকে একত্রীকরণ করতে চান তবে আপনাকে এটি নিজে হাতে করতে হবে)


19

এখানে এমন একটি সংস্করণ যা *অনিয়মিত সংখ্যক অবজেক্টগুলিতে পুনরাবৃত্তভাবে (ব্যবহার করে ) কাজ করে :

echo '{"A": {"a": 1}}' '{"A": {"b": 2}}' '{"B": 3}' | jq --slurp 'reduce .[] as $item ({}; . * $item)'
{
  "A": {
    "a": 1,
    "b": 2
  },
  "B": 3
}

2
দুর্দান্ত উত্তর। ডিরেক্টরিতে সমস্ত ফাইল মার্জ করার সময় ভাল কাজ করে:jq -s 'reduce .[] as $item ({}; . * $item)' *.json
— জন এলমোর

7

প্রথমত, {"মান":। মান} কেবলমাত্র {মান} এ সংক্ষেপিত হতে পারে}

দ্বিতীয়ত, --argfile বিকল্পটি (jq 1.4 এবং jq 1.5 এ উপলব্ধ) আগ্রহী হতে পারে কারণ এটি --slurp বিকল্পটি ব্যবহার করা এড়িয়ে চলে।

এগুলি একসাথে রাখলে, দুটি ফাইলের দুটি অবজেক্টকে নিম্নরূপে নির্দিষ্ট উপায়ে সংযুক্ত করা যায়:

$ jq -n --argfile o1 file1 --argfile o2 file2 '$o1 * $o2 | {value}'

'-N' পতাকাটি জিকিউকে স্টিডিন থেকে না পড়তে বলে, যেহেতু ইনপুটগুলি এখানে --argfile বিকল্পগুলি থেকে আসছে।


2
jq এর --argileজন্য হ্রাস করা হয়েছে--slurpfile
— ডেভিড গ্রুমস

3

এটি কমান্ডে উল্লিখিত যে কোনও সংখ্যক ফাইলের মার্জ করতে ব্যবহার করা যেতে পারে:

jq -rs 'reduce .[] as $item ({}; . * $item)' file1.json file2.json file3.json ... file10.json

বা এটি যে কোনও ফাইলের জন্য

jq -rs 'reduce .[] as $item ({}; . * $item)' ./*.json

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