Skip to content

London | Samira Hekmati | Module Tools | Week 2 | jq #42

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion jq/scores.json
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
[{"name": "Ahmed", "city": "London", "scores": [1, 10, 4]}, {"name": "Basia", "city": "London", "scores": [22, 9, 6]}, {"name": "Mehmet", "city": "Birmingham", "scores": [3, 12, 17]}, {"name": "Leila", "city": "London", "scores": [1]}, {"name": "Piotr", "city": "Glasgow", "scores": [15, 2, 25, 11, 8]}, {"name": "Chandra", "city": "Birmingham", "scores": [12, 6]}]
[
{ "name": "Ahmed", "city": "London", "scores": [1, 10, 4] },
{ "name": "Basia", "city": "London", "scores": [22, 9, 6] },
{ "name": "Mehmet", "city": "Birmingham", "scores": [3, 12, 17] },
{ "name": "Leila", "city": "London", "scores": [1] },
{ "name": "Piotr", "city": "Glasgow", "scores": [15, 2, 25, 11, 8] },
{ "name": "Chandra", "city": "Birmingham", "scores": [12, 6] }
]
10 changes: 10 additions & 0 deletions jq/script-01.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,13 @@ set -euo pipefail
# The input for this script is the person.json file.
# TODO: Write a command to output the name of the person.
# Your output should be exactly the string "Selma", but should not contain any quote characters.


echo "first solution using cat command and pipeline:"
cat person.json | jq '.name'

echo ""

echo "second solution using jq only:"
jq '.name' person.json

13 changes: 13 additions & 0 deletions jq/script-02.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,16 @@ set -euo pipefail
# The input for this script is the person.json file.
# TODO: Write a command to output the address of the person, all on one line, with a comma between each line.
# Your output should be exactly the string "35 Fashion Street, London, E1 6PX", but should not contain any quote characters.

#note to self:
# What Each Part Does
# jq → Calls the jq tool.
# -r → Removes quotes from the output (so the result is a plain string, not JSON).
# .address → Extracts the address array from the JSON.
# | join(", ") →
# Takes all elements in the array: ["35 Fashion Street", "London", "E1 6PX"]
# Joins them into a single string, separated by ", ".
# ❌ Do NOT use .address[] if address is an array of strings
# ✅ Use .address[] when address is an array of objects

jq -r '.address | join(", ")' person.json
2 changes: 2 additions & 0 deletions jq/script-03.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ set -euo pipefail
# The input for this script is the person.json file.
# TODO: Write a command to output the name of the person, then a comma, then their profession.
# Your output should be exactly the string "Selma, Software Engineer", but should not contain any quote characters.

jq -r '[.name, .profession] | join(", ")' person.json
2 changes: 2 additions & 0 deletions jq/script-04.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ set -euo pipefail
# TODO: Write a command to output just the names of each player, one per line.
# Your output should contain 6 lines, each with just one word on it.
# Your output should not contain any quote characters.

jq -r '.[].name' scores.json
2 changes: 2 additions & 0 deletions jq/script-05.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ set -euo pipefail
# The input for this script is the scores.json file.
# TODO: Write a command to output the names of each player, as well as their city.
# Your output should contain 6 lines, each with two words on it.

jq -r '.[] | "\(.name) \(.city)"' scores.json
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In script-03 you used join and here you used string interpolation - both work, and both could be used in both places - do you have any thoughts on which you prefer / which is more clear?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you so much Daniel, @illicitonion for your feedback! I agree that both methods join(", ") and string interpolation are valid, and it's interesting to think about their usage in different contexts.

For example in script-03, I chose join(", ") as I felt it was a cleaner way to handle the array of values (in this case, name and profession). It also keeps the structure clear by dealing with the array directly. On the other hand, in script-05, I used string interpolation because it was more intuitive for handling the dynamic insertion of values within a string.

I don't have a strong preference for one over the other, but I can see how string interpolation may be more flexible, especially if we were working with more complex strings or needing more control over formatting.

I think, if clarity and simplicity are the primary goals, join(", ") works well for array type of structures, while string interpolation might be more readable when we're dealing with individual elements or values.

2 changes: 2 additions & 0 deletions jq/script-06.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ set -euo pipefail
# TODO: Write a command to output just the names of each player along with the score from their first attempt.
# Your output should contain 6 lines, each with one word and one number on it.
# The first line should be "Ahmed 1" with no quotes.

jq -r '.[] | .scores[0] as $scores | "\(.name) \($scores)" ' scores.json
2 changes: 2 additions & 0 deletions jq/script-07.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ set -euo pipefail
# TODO: Write a command to output just the names of each player along with the score from their last attempt.
# Your output should contain 6 lines, each with one word and one number on it.
# The first line should be "Ahmed 4" with no quotes.

jq -r '.[] | .scores[-1] as $lastScore | "\(.name) \($lastScore)" ' scores.json
2 changes: 2 additions & 0 deletions jq/script-08.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ set -euo pipefail
# TODO: Write a command to output just the names of each player along with the number of times they've played the game.
# Your output should contain 6 lines, each with one word and one number on it.
# The first line should be "Ahmed 3" with no quotes.

jq -r '.[] | "\(.name) \(.scores | length)"' scores.json
10 changes: 10 additions & 0 deletions jq/script-09.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,13 @@ set -euo pipefail
# TODO: Write a command to output just the names of each player along with the total scores from all of their games added together.
# Your output should contain 6 lines, each with one word and one number on it.
# The first line should be "Ahmed 15" with no quotes.

echo "first solution"

jq -r '.[] | "\(.name) \([.scores[]] | add)"' scores.json

echo ""

echo "simpler solution"

jq -r '.[] | "\(.name) \((.scores | add))"' scores.json
2 changes: 2 additions & 0 deletions jq/script-10.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ set -euo pipefail
# The input for this script is the scores.json file.
# TODO: Write a command to output the total of adding together all players' first scores.
# Your output should be exactly the number 54.

jq '[.[].scores[0]] | add' scores.json
2 changes: 2 additions & 0 deletions jq/script-11.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ set -euo pipefail
# The input for this script is the scores.json file.
# TODO: Write a command to output the total of adding together all scores from all games from all players.
# Your output should be exactly the number 164.

jq '[.[].scores[]] | add' scores.json