1

I was wondering if there was a way to use AWK or SED to find certain values in a certain file that are higher than the argument you gave to the script. This being

./script.sh CITY VALUE

The value, in this case, is the $2 or second argument which is going to the minimum value of our search, so if we have a file,

dummy2.txt

Format: Name;ID;Profession;email;rating;number of visits;balance

John Trevolta;12334;dentist;gmail;0;0;431
Isabella;4567;dentist;gmail;0;0;400
Maria;888;General Doctor;hotmail;4;2;700
Joseph;127;Intern;outlook;0;0;450

and if we input,

./script.sh Lisbon 400

(Ignore the Lisbon/CITY part as it doesn't pose a problem and it reads it from another file)

It should be able to read every column ( the seventh in this case ($7)) from this exact dummy2.txt and output the number of times it finds a value higher than the one we gave it so the desired output would be:

Found: 3

But the current Output I'm given is the following if I use the following expression:

awk -F';' '$7>=x' x="$2" medicos.txt | sort | uniq -c

1 John Travolta;12334;dentist;Gmail;0;0;431
1 Maria;888;General Doctor;hotmail;4;2;700
1 Joseph;127;Intern;outlook;0;0;450

OR

This is the output when with the current expression:

awk -v  x=$2 '$7>x{ i++ }END{ print "Found:" i }' dummy2.txt

Found:

So with this, this is my current code that I have for it:

#!/bin/bash
if [ "$#" -eq 0 ]
    then
        echo "Please insert arguments"
        exit 1
elif [ "$#" -lt 2 ] || [ -z "$1"  ]
    then
        echo "Error 404: No arguments found"
        exit 1
else
    grep -c "$1" dummy.txt
    awk -v  x=$2 '$7>x{ i++ }END{ print "Found:" i }' dummy2.txt
    fi

It doesn't start counting the i or even say it's value. I don't know if I need to initialize it or not and if I need to put ''/"/$ on it for it to be read.

Previous post which was a mess and everything was all over the place:

Counting the number of occurences or higher value in a file

Updated it but it remains closed.

Box
  • 91
  • 6
  • Thanks for showing your efforts in form code. Could you please edit your question with more clear samples of input and expected output for better understanding of question, thank you. – RavinderSingh13 Oct 25 '20 at 15:00
  • I hope this, makes it clearer. I forgot I was putting the output from my initial expression and then the one I currently have... – Box Oct 25 '20 at 15:08

1 Answers1

3

Could you please try following. Corrected/fixed the awk command here, rest of the bash conditions taken from OP's attempt itself.

Only awk command: which are looking for could be.

awk -v value="$2" 'BEGIN{FS=OFS=";"} $NF>=value{count++} END{print "Found: "count}'  Input_file

Your code could become like:

#!/bin/bash
if [ "$#" -eq 0 ]
    then
        echo "Please insert arguments"
        exit 1
elif [ "$#" -lt 2 ] || [ -z "$1"  ]
    then
        echo "Error 404: No arguments found"
        exit 1
else
     awk -v value="$2" 'BEGIN{FS=OFS=";"} $NF>=value{count++} END{print "Found: "count}'  Input_file
fi
.........rest of your things here.......

Explanation of above awk solution: Adding detailed explanation for above.

awk -v value="$2" '       ##Starting awk program from here, creating value variable here which has 2nd argument value passed to bash script here.
BEGIN{                    ##Starting BEGIN section of this program from here.
  FS=OFS=";"              ##Setting field separator and output field separator as ; here.
}
$NF>=value{               ##Checking condition if last field value is greater than or equal to value.
  count++                 ##Increasing value of count with 1 here.
}
END{                      ##Starting END block of this program from here.
  print "Found: "count    ##Printing Found: string with value of count here.
}
'  Input_file             ##Mentioning Input_file name here.

Issues in OP's attempt:

For attempt awk -v x=$2 '$7>x{ i++ }END{ print "Found:" i }': Logic is good with since there is NO field separator is set(it should be ; as per samples) hence its failing here.

For attempt awk -F';' '$7>=x' x="$2" medicos.txt | sort | uniq -c: Logic and awk looks good but as per question there is NO need for sort and uniq(not sure if later point of time it is needed for some other requirements of OP but for mentioned question it isn't needed).

RavinderSingh13
  • 130,504
  • 14
  • 57
  • 93
  • 1
    Thank you very much! Would it be possible if you could explain to me what was wrong with the previous ones and what's new in yours? I'm still learning this language. – Box Oct 25 '20 at 15:21
  • 1
    @Box, sure will add detailed explanation and mistakes in your attempt(if there are any found) too in few mins or so, cheers. – RavinderSingh13 Oct 25 '20 at 15:24
  • 1
    @Box, Details are added, kindly do check the same, happy learning. – RavinderSingh13 Oct 25 '20 at 15:32