From 5b007a259681e1f4318aa804b38dc6eb31197cad Mon Sep 17 00:00:00 2001 From: shaghayeghfar <146011477+shaghayeghfar@users.noreply.github.com> Date: Tue, 24 Mar 2026 19:11:58 +0000 Subject: [PATCH 1/2] complete jq exersice --- implement-shell-tools/cat/cat.js | 54 ++++++++++++++++++++++++++++++++ implement-shell-tools/ls/ls.js | 35 +++++++++++++++++++++ jq/script-01.sh | 2 ++ jq/script-02.sh | 2 ++ jq/script-03.sh | 2 ++ jq/script-04.sh | 2 ++ jq/script-05.sh | 2 ++ jq/script-06.sh | 2 ++ jq/script-07.sh | 2 ++ jq/script-08.sh | 2 ++ jq/script-09.sh | 2 ++ jq/script-10.sh | 2 ++ jq/script-11.sh | 2 ++ 13 files changed, 111 insertions(+) create mode 100644 implement-shell-tools/cat/cat.js create mode 100644 implement-shell-tools/ls/ls.js diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js new file mode 100644 index 000000000..88497a169 --- /dev/null +++ b/implement-shell-tools/cat/cat.js @@ -0,0 +1,54 @@ +const fs = require("fs"); +const path = require("path"); + +// arguments +const args = process.argv.slice(2); + +let isNumbered = false; +let isNumberNonEmpty = false; +const filePaths = []; + +// parse args +args.forEach((arg) => { + if (arg === "-n") { + isNumbered = true; + } else if (arg === "-b") { + isNumberNonEmpty = true; + } else { + filePaths.push(arg); + } +}); + +// -b overrides -n +if (isNumberNonEmpty) { + isNumbered = false; +} + +let lineNumber = 1; + +// process files +filePaths.forEach((filePath, fileIndex) => { + const content = fs.readFileSync(filePath, "utf-8"); + + // split lines but keep empty ones + const lines = content.split("\n"); + + lines.forEach((line, index) => { + const isLastLineOfLastFile = + fileIndex === filePaths.length - 1 && index === lines.length - 1; + + if (isNumberNonEmpty) { + if (line !== "") { + console.log(`${lineNumber} ${line}`); + lineNumber++; + } else { + console.log(line); + } + } else if (isNumbered) { + console.log(`${lineNumber} ${line}`); + lineNumber++; + } else { + console.log(line); + } + }); +}); diff --git a/implement-shell-tools/ls/ls.js b/implement-shell-tools/ls/ls.js new file mode 100644 index 000000000..d9474bf18 --- /dev/null +++ b/implement-shell-tools/ls/ls.js @@ -0,0 +1,35 @@ +const fs = require("fs"); + +// Get command line arguments +const args = process.argv.slice(2); + +// Default settings +let showAll = false; +let onePerLine = false; +let dir = "."; + +// Parse arguments +args.forEach((arg) => { + if (arg === "-a") { + showAll = true; + } else if (arg === "-1") { + onePerLine = true; + } else { + dir = arg; + } +}); + +// Read directory contents +let files = fs.readdirSync(dir); + +// Filter hidden files if -a is NOT used +if (!showAll) { + files = files.filter((file) => !file.startsWith(".")); +} + +// Output +if (onePerLine) { + files.forEach((file) => console.log(file)); +} else { + console.log(files.join(" ")); +} diff --git a/jq/script-01.sh b/jq/script-01.sh index 95827f688..5b93f5852 100755 --- a/jq/script-01.sh +++ b/jq/script-01.sh @@ -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. # Your output should be exactly the string "Selma", but should not contain any quote characters. + +jq -r '.name' person.json \ No newline at end of file diff --git a/jq/script-02.sh b/jq/script-02.sh index 21544d67b..c1d25ab82 100755 --- a/jq/script-02.sh +++ b/jq/script-02.sh @@ -5,3 +5,5 @@ 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. + +jq -r '.address | join(", ")' person.json \ No newline at end of file diff --git a/jq/script-03.sh b/jq/script-03.sh index 3566f03ba..3f9bf26e1 100755 --- a/jq/script-03.sh +++ b/jq/script-03.sh @@ -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)"' person.json \ No newline at end of file diff --git a/jq/script-04.sh b/jq/script-04.sh index 015997e18..756dd6702 100755 --- a/jq/script-04.sh +++ b/jq/script-04.sh @@ -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 \ No newline at end of file diff --git a/jq/script-05.sh b/jq/script-05.sh index 993fc9ee3..37069392e 100755 --- a/jq/script-05.sh +++ b/jq/script-05.sh @@ -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 \ No newline at end of file diff --git a/jq/script-06.sh b/jq/script-06.sh index 8b6e74c52..a86fc30fb 100755 --- a/jq/script-06.sh +++ b/jq/script-06.sh @@ -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 '.[] | "\(.name) \(.scores[0])"' scores.json \ No newline at end of file diff --git a/jq/script-07.sh b/jq/script-07.sh index d43f93d1b..ea187a89e 100755 --- a/jq/script-07.sh +++ b/jq/script-07.sh @@ -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 '.[] | "\(.name) \(.scores[-1])"' scores.json \ No newline at end of file diff --git a/jq/script-08.sh b/jq/script-08.sh index 6671fd1ba..2a2597390 100755 --- a/jq/script-08.sh +++ b/jq/script-08.sh @@ -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 \ No newline at end of file diff --git a/jq/script-09.sh b/jq/script-09.sh index c2536a536..219ca4b47 100755 --- a/jq/script-09.sh +++ b/jq/script-09.sh @@ -6,3 +6,5 @@ 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. + +jq -r '.[] | "\(.name) \(.scores | add)"' scores.json \ No newline at end of file diff --git a/jq/script-10.sh b/jq/script-10.sh index 8e9d75f07..47c97b79d 100755 --- a/jq/script-10.sh +++ b/jq/script-10.sh @@ -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 -r 'map(.scores[0]) | add' scores.json \ No newline at end of file diff --git a/jq/script-11.sh b/jq/script-11.sh index d2337a6b2..12e049235 100755 --- a/jq/script-11.sh +++ b/jq/script-11.sh @@ -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 -r '[.[].scores[]] | add' scores.json \ No newline at end of file From e7cadcef17c3bbc7cfb26bb43c5c9af15af62567 Mon Sep 17 00:00:00 2001 From: shaghayeghfar <146011477+shaghayeghfar@users.noreply.github.com> Date: Tue, 24 Mar 2026 19:39:12 +0000 Subject: [PATCH 2/2] Remove unrelated files --- implement-shell-tools/cat/cat.js | 54 -------------------------------- implement-shell-tools/ls/ls.js | 35 --------------------- 2 files changed, 89 deletions(-) delete mode 100644 implement-shell-tools/cat/cat.js delete mode 100644 implement-shell-tools/ls/ls.js diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js deleted file mode 100644 index 88497a169..000000000 --- a/implement-shell-tools/cat/cat.js +++ /dev/null @@ -1,54 +0,0 @@ -const fs = require("fs"); -const path = require("path"); - -// arguments -const args = process.argv.slice(2); - -let isNumbered = false; -let isNumberNonEmpty = false; -const filePaths = []; - -// parse args -args.forEach((arg) => { - if (arg === "-n") { - isNumbered = true; - } else if (arg === "-b") { - isNumberNonEmpty = true; - } else { - filePaths.push(arg); - } -}); - -// -b overrides -n -if (isNumberNonEmpty) { - isNumbered = false; -} - -let lineNumber = 1; - -// process files -filePaths.forEach((filePath, fileIndex) => { - const content = fs.readFileSync(filePath, "utf-8"); - - // split lines but keep empty ones - const lines = content.split("\n"); - - lines.forEach((line, index) => { - const isLastLineOfLastFile = - fileIndex === filePaths.length - 1 && index === lines.length - 1; - - if (isNumberNonEmpty) { - if (line !== "") { - console.log(`${lineNumber} ${line}`); - lineNumber++; - } else { - console.log(line); - } - } else if (isNumbered) { - console.log(`${lineNumber} ${line}`); - lineNumber++; - } else { - console.log(line); - } - }); -}); diff --git a/implement-shell-tools/ls/ls.js b/implement-shell-tools/ls/ls.js deleted file mode 100644 index d9474bf18..000000000 --- a/implement-shell-tools/ls/ls.js +++ /dev/null @@ -1,35 +0,0 @@ -const fs = require("fs"); - -// Get command line arguments -const args = process.argv.slice(2); - -// Default settings -let showAll = false; -let onePerLine = false; -let dir = "."; - -// Parse arguments -args.forEach((arg) => { - if (arg === "-a") { - showAll = true; - } else if (arg === "-1") { - onePerLine = true; - } else { - dir = arg; - } -}); - -// Read directory contents -let files = fs.readdirSync(dir); - -// Filter hidden files if -a is NOT used -if (!showAll) { - files = files.filter((file) => !file.startsWith(".")); -} - -// Output -if (onePerLine) { - files.forEach((file) => console.log(file)); -} else { - console.log(files.join(" ")); -}