Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.3k views
in Technique[技术] by (71.8m points)

jq merge objects after find in array

A generated config file (from ls) results in

[
  {
    "file": "PDF/College Louise Michèle 402.pdf",
    "rotation": "-90",
    "fiducial": false
  }
]
[
  {
    "file": "PDF/College PLUM 4 A.pdf",
    "rotation": "-90",
    "fiducial": false
  }
]
[
  {
    "file": "PDF/College RS 4 D.pdf",
    "rotation": "-90",
    "fiducial": false
  }
]
[
    {
        "file": "PDF/Q College.pdf",
        "rotation": "90",
        "fiducial": "false"
    }
]
[
    {
        "file": "PDF/Test_q2c.pdf",
        "rotation": "90",
        "fiducial": "true",
        "nopdf": "true"
    }
]
[
    {
        "file": "PDF/Test_q2c.pdf",
        "rotation": "90",
        "fiducial": "true",
        "x":"false"
    }
]
[
  {
    "file": "PDF/Test q2b.pdf",
    "rotation": "90",
    "fiducial": false
  }
]
[
  {
    "file": "PDF/Test questionnaires.pdf",
    "rotation": "90",
    "fiducial": false
  }
]

[
  {
    "file": "PDF/XCollege Bourail 4 B pdf.pdf",
    "rotation": "-90",
    "fiducial": false
  }
]
[
  {
    "file": "PDF/test rotate.pdf",
    "rotation": "90",
    "fiducial": false
  }
]

I need to extract each object using filename as key, which is done by

jq -r ".[] | select(.file | contains("q2c"))"

Unfortunately, there are conflicts and when objects are not unique, I need to merge them. for instance obtained answer:

{
  "file": "PDF/Test_q2c.pdf",
  "rotation": "90",
  "fiducial": "true",
  "nopdf": "true"
}
{
  "file": "PDF/Test_q2c.pdf",
  "rotation": "90",
  "fiducial": "true",
  "x":"false"
}

expected answer

{
  "file": "PDF/Test_q2c.pdf",
  "rotation": "90",
  "fiducial": "true",
  "nopdf": "true",
  "x":"false"
}

I try with the .|group_by(.file)[]|add but get no success... thanks in advance.

question from:https://stackoverflow.com/questions/65651244/jq-merge-objects-after-find-in-array

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

For relatively smaller input streams, you can "slurp" the objects and combine them into one array using the add function and the -s command-line option:

jq --slurp 'add | map(select(.file | contains("q2c"))) | add'

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...