Barney Chambers
Barney Chambers

Reputation: 2783

Bash script to isolate words in a file

Here is my initial input data to be extracted:

david ex1=10 ex2=12 quiz1=5 quiz2=9 exam=99
judith ex1=8 ex2=16 quiz1=4 quiz2=10 exam=90
sam ex1=8 quiz1=5 quiz2=11 exam=85
song ex1=8 ex2=20 quiz2=11 exam=87

How do extract each word to be formatted in this way:

david 
ex1=10
ex2=12
etc...

As I eventually want to have output like this:

david 12 99
judith 16 90
sam 0 85
song 20 87

when I run my program with the commands:

./marks ex2 exam < file

Upvotes: 1

Views: 311

Answers (2)

prodev_paris
prodev_paris

Reputation: 515

Supposed your input file is named input.txt, just replace space char by new line char using tr command line tool:

tr ' ' '\n' < input.txt

For your second request, you may have to extract specific field on each line, so the cut and awk commands may be useful (note that my example is certainly improvable):

while read p; do
  echo -n "$(echo $p | cut -d ' ' -f1) "                  # name
  echo -n "$(echo $p | cut -d ' ' -f3 | cut -d '=' -f2) " # ex2 val
  echo -n $(echo $p | awk -F"exam=" '{ print  $2 }')      # exam val
  echo
done < input.txt

Upvotes: 2

Tom Fenech
Tom Fenech

Reputation: 74596

This script does what you want:

#!/bin/bash

a=$@
awk -v a="$a" -F'[[:space:]=]+' '
BEGIN {
    split(a, b) # split field names into array b
}
{
    printf "%s ", $1 # print first field
    for (i in b) { # loop through fields to search for
        f = 0 # unset "found" flag
        for (j=2; j<=NF; j+=2) # loop though remaining fields, 2 at a time
            if ($j == b[i]) { # if field matches value in array
                printf "%s ",$(j+1)
                f = 1 # set "found" flag
            }
        if (!f) printf "0 " # add 0 if field not found
    }
    print "" # add newline
}' file

Testing it out

$ ./script.sh ex2 exam
david 12 99
judith 16 90
sam 0 85
song 20 87

Upvotes: 0

Related Questions