# Assignment-1 SHELL Solutions

**Question-1:**

```bash
cat "$1" | sed  "s/./#/5g" > output.txt 
```

**Question-2:**

```bash
#!/bin/bash

file_path=$1 # taking the path of input file
value=`cat $1` # reading the file

IFS=' ' # setting delimiter as <space>
read -ra arr<<<$value #splitting the input text by the delimiter and storing the splits in array named arr
n=${#arr[@]} # n = total no. of elements in the array
dob=${arr[$n-1]} # date of birth is the last element of the array

IFS='/'
read -ra arr2<<<$dob
dob_day=${arr2[0]}				# Getting day,month,year for dob date
dob_month=${arr2[1]}      
dob_year=${arr2[2]}

cur_date=$(date '+%Y-%m-%d')
IFS='-'
read -ra arr3<<<$cur_date
cur_day=${arr3[2]}				# Getting day,month,year for current date
cur_month=${arr3[1]}
cur_year=${arr3[0]}


age=$(( cur_year - dob_year ))

if [[ ${cur_month#0} -lt ${dob_month#0} ]]; then	
	age=$(( $age - 1 ))
elif [[ ${cur_month#0} -eq ${dob_month#0} ]]; then				# Basic logic for age calculation
	if [[ ${cur_day#0} -lt ${dob_day#0} ]]; then
		age=$(( $age - 1 ))
	fi
fi

unset arr[-1]
arr+=($age)
function join { local IFS=" "; shift; echo "$*"; }				# Output Generation
result=$(join , ${arr[@]})

echo $result
echo $result > output.txt
```

**Question-3:**

```bash
#!/bin/bash 

echo "1. Words - start with 's' and is not follow by 'a'" 

cat "$1" | grep -o "\bs[^a]\w*" 

echo "2. Word starts with 'w' and is followed by 'h'" 

cat "$1" | grep -o "\bwh\w*" 

echo "3. Word starts with 't' and is followed by 'h'" 

cat "$1" | grep -o "\bth\w*" 

echo "4. Word starts with 'a' and is not followed by 'n'" 

cat "$1" | grep -o "\ba[^n]\w*" 
```

**Question-4:**

```bash
```

**Question-5:**

```bash
#!/bin/bash

echo "Directories:"
find $1 -mindepth 1 -type d -printf '%f, ' -execdir sh -c 'echo "$(find "{}" -mindepth 1 -type f | wc -l)" file\(s\)' \; | sort -nr -k 2

echo "Files:"
find $1 -mindepth 1 -type f -printf '%s %f\n' | sort -nr -k 1 | awk '{print $2}';
```

**Question-6:**

```bash
#!/bin/bash

#taking flag input 
# this way, we take input irrespective of the order of flags
while getopts ":C:k:f:l:n:o:v:adc:" fl;
do
    case "${fl}" in
        f) fname=${OPTARG};;
        l) lname=${OPTARG};;
        n) mobile=${OPTARG};;
        C) op=${OPTARG};;
        c) column=${OPTARG};;
        v) search=${OPTARG};;
        d) descending=1;;
        a) ascending=1;;
        o) office=${OPTARG};;
        k) ename=${OPTARG};;
    esac
done

# initiating the contacts.csv file
touch contacts.csv
lines=$(cat contacts.csv | wc -l)
if [ $lines == 0 ]
then
    echo "fname,lname,mobile,Office" > contacts.csv
fi

#executing the desired command

case "${op}" in
    insert)
        echo -n "" >> contacts.csv
        echo "${fname},${lname},${mobile},${office}" >> contacts.csv;;

    #executing search by iteratively reading the file and matching the value of the specified column 
    search)
        if [[ "$column" == "fname" ]]
        then
            while IFS="," read -r a b c d
            do
                if [[ "$a" == "$search" ]]
                then
                    echo $a,$b,$c,$d
                fi
            done < contacts.csv
        elif [[ "$column" == "lname" ]]
        then
            while IFS="," read -r a b c d
            do
                if [[ "$b" == "$search" ]]
                then
                    echo $a,$b,$c,$d
                fi
            done < contacts.csv
        elif [[ "$column" == "mobile" ]]
        then
            while IFS="," read -r a b c d
            do
                if [[ "$c" == "$search" ]]
                then
                    echo $a,$b,$c,$d
                fi
            done < contacts.csv
        else
            while IFS="," read -r a b c d
            do
                if [[ "$d" == "$search" ]]
                then
                    echo $a,$b,$c,$d
                fi
            done < contacts.csv
        fi
        ;;

    #executing delete by iteratively reading the file and matching the value of the specified column 
    #if the value matches, we skip it 
    delete)
        touch temp.csv
        if [[ "$column" == "fname" ]]
        then
            while IFS="," read -r a b c d
            do
                if [[ "$a" != "$search" ]]
                then
                    echo "${a},${b},${c},${d}" >> temp.csv
                fi
            done < contacts.csv
        elif [[ "$column" == "lname" ]]
        then
            while IFS="," read -r a b c d
            do
                if [[ "$b" != "$search" ]]
                then
                    echo "${a},${b},${c},${d}" >> temp.csv
                fi
            done < contacts.csv
        elif [[ "$column" == "mobile" ]]
        then
            while IFS="," read -r a b c d
            do
                if [[ "$c" != "$search" ]]
                then
                    echo "${a},${b},${c},${d}" >> temp.csv
                fi
            done < contacts.csv
        else
            while IFS="," read -r a b c d
            do
                if [[ "$d" != "$search" ]]
                then
                    echo "${a},${b},${c},${d}" >> temp.csv
                fi
            done < contacts.csv
        fi
        cat temp.csv > contacts.csv
        rm temp.csv
        ;;

    #executing display, sorting based on first name by using the sort command with k flag. 
    #t flag is used to define the separato as coma
    display)
        touch temp.csv
        cat contacts.csv > temp.csv
        if [[ "$ascending" == 1 ]]
        then
            tail -n+2 temp.csv | sort -k1 -t,
        elif [[ "$descending" == 1 ]]
        then
            tail -n+2 temp.csv | sort -k1 -r -t,
        else
            tail -n+2 temp.csv
        fi
        rm temp.csv
        ;;

    #executing edit by iterating over the rows
    # if the value matches the specified value, we replace the row with the input, else echo the row back
    edit)
        touch temp.csv
        while IFS="," read -r a b c d
        do
            if [[ "$a" == "$ename" ]]
            then
                echo "${fname},${lname},${mobile},${office}" >> temp.csv
            else
                echo "${a},${b},${c},${d}" >> temp.csv
            fi
        done < contacts.csv
        cat temp.csv > contacts.csv
        rm temp.csv
        ;;
esac 

```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://serciiit.gitbook.io/introduction-to-software-systems/assignments/assignment-1-shell-solutions.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
