Abhishek
Abhishek

Reputation: 13

Get comma separated values in shell script

I have a file with multiple lines like the following string. I need to extract the values of id and obj.

{"Class":"ZONE","id":"DEV100.ZN301","name":"3109 E BTM","zgroup":"EAST FLOOR 3","prog":"","members":[{"obj":"DEV300.WC3"},{"obj":"DEV300.WC4"},{"obj":"DEV300.WC7"},{"obj":"DEV300.WC10"}]}

I am using the following command to obtain the output:

[user@server ~]$ cat file.txt | grep "\"Class\":\"ZONE\"" | while IFS="," read -r a b c d e f ; do echo "$b$f";done | grep ZN301

Output:

"id":"DEV100.ZN301""members":[{"obj":"DEV300.WC3"},{"obj":"DEV300.WC4"},{"obj":"DEV300.WC7"},{"obj":"DEV300.WC10"}]}

My aim is to get the following Output:

DEV100.ZN301 : DEV300.WC3 , DEV300.WC4 , DEV300.WC7 , DEV300.WC10

Please help me out. Thanks!

Upvotes: 0

Views: 409

Answers (1)

Charles Duffy
Charles Duffy

Reputation: 295308

jq -r 'select(.Class == "ZONE") | (.id + " : " + ([.members[] | .obj] | join(" , ")))'

...or, leaning on a Python interpreter:

parse_json() {
  python -c '
import sys, json
for line in sys.stdin:
  line = line.strip()    # ignore trailing newlines
  if not line: continue  # skip blank lines
  doc = json.loads(line)
  if doc.get("Class") != "ZONE":
    continue
  line_id = doc.get("id")
  objs = [m.get("obj") for m in doc.get("members", [])]
  sys.stdout.write("%s : %s\n" % (line_id, " , ".join(objs)))
'
}

parse_json 

Upvotes: 1

Related Questions