Search code examples
unixgrepcut

How to change horizontal input to vertical output


I am using UNIX Korn shell. I am trying to create a program in Unix that will search a text file which is shown below:

Last Name:First Name:City:State:Class:Semester Enrolled:Year First Enrolled

Gilman:Randy:Manhattan:KS:Junior:Spring:2010
Denton:Jacob:Rochester:NY:Senoir:Fall:2009
Goodman:Joshua:Warren:MI:Freshman:Summer:2014
Davidson:Blair:Snohomish:WA:Sophmore:Fall:2013
Anderson:Neo:Seattle:WA:Senoir:Spring:2008
Beckman:John:Ft. Polk:LA:Freshman:Spring:2014

Then take that line and cut it out and display it vertically. So if I search Gilman. It would produce:

Gilman
Randy
Manhattan
KS
Junior
Spring
2010

However included in this I should also be able to produce the following layout:

Last Name: Gilman
First Name: Randy
City: Manhattan
State: KS
Class: Junior
Semester Enrolled: Spring
Year First Enrolled: 2010

Now I have figured out most of it which I will display in my code below:

cat<<MENULIST
                         A - Add Student Information 
                         D - Delete Student Information
                         M - Modify Student Information
                         I - Inquiry on a Student
                         X - Exit

MENULIST

    echo -en '\n'
    echo -en '\n'
    echo "                      Pleasa choose one of the following:                      "

    #take input from operation

    read choice

    case $choice in
        a|A) ;; 
        d|D) ;;
        m|M) ;;
        i|I)   
            #Create Inguiry Message
            clear
            echo "                                 Record Inquiry                                 "
            echo -en '\n'
            echo -en '\n'
            echo "What is the last name of the person"
            #Gather search parameter
            read last_name
            grep -i "$last_name" $1 | cut -f 1-7 -d ':' ;;


        x|X) echo "The program is ending" ; exit 0;;
        *) echo -en '\n' ;echo "Not an acceptable entry." ;echo "Please press enter to try again"; read JUNK | tee -a $2 ; continue
    esac

I am just really having trouble on redirecting input to the proper output. There is much more to the program but this is the relevant portion for this problem. Any help would be appreciated.

EDIT:

Ok the final answer is shown below:

while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
                case "$c1" in
                    "$last_name" )
                        echo -e "Last Name: $c1\nFirst Name: $c2\nCity: $c3\nState: $c4\nClass: $c5\nSemester Enrolled: $c6\nYear First Enrolled: $c7\n\n"
                    ;;
                esac
            done < $1

This performed the intended outcome correctly thank you everyone for your help. I still have some other questions but I will make a new topic for that so it doesn't get to jumbled together.


Solution

  • Replace your line

     grep -i "$last_name" $1 | cut -f 1-7 -d ':' ;;
    

    with

      awk -F: -vnameMatch="$last_name" \
       '$1==nameMatch{
          printf("LastName:%s\nFirstName:%s\nCity:%s\nState:%s\nClass:%s\nSemester Enrolled:%s\nYear First Enrolled:%s\n\n", \
                 $1, $2, $3, $4, $5, $6, $7)
        }' $1 
    ;;
    

    It's pretty much the same idea in ksh.

    while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
      case "$c1" in 
        "$last_name" )
            printf "LastName:%s\nFirstName:%s\nCity:%s\nState:%s\nClass:%s\nSemester Enrolled:%s\nYear First Enrolled:%s\n\n",
                 "$c1" "$c2" "$c3" "$c4" "$c5" "$c6" "$c7"
          ;;
       esac
      done < $1
    

    I think I've got all the syntax right, but don't have the energy tonight to test :-/ ... If you can use this, and there are problems, post a comment and I'll clean it up.

    IHTH.

    EDIT:

    #Case statement for conducting an inquiry of the file
            i|I)   
                #Create Inguiry Message
                clear
                echo "                                 Record Inquiry                                 "
                echo -en '\n'
                echo -en '\n'
                echo "What is the last name of the person:"
                #Gather search parameter
                read last_name
                while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
                    case "$c1" in
                        "$last_name" )
                            printf "Last Name:%s\nFirst Name:%s\nCity:%s\nState:%s\nClass:%s\nSemester Enrolled:%s\nYear First Enrolled:%s\n\n", "$c1", "$c2", "$c3", "$c4", "$c5", "$c6", "$c7"
                        ;;
                    esac
                done < $2
            #Case statement for ending the program          
            x|X) echo "The program is ending" ; exit 0;;
    

    The error message is:

    ./asg7s: line 26: syntax error at line 93: `)' unexpected

    Line 93 is

    x|X) echo "The program is ending" ; exit 0;;
    

    Kind of weird because I didn't mess with that part of the program so I know it has to be something in the portion I changed.

    RLG

    Adding something extra so I can save RLG edit without other's "approval"