জেকিউ ব্যবহার করে 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.