0

In awk I have a file that every line contains a number in the range between 1..16 in field $5. For Example:

X;X;X;X;1;X;X
X;X;X;X;8;X;X
X;X;X;X;25;X;X
X;X;X;X;5;X;X

I want to check the number in field $5 and print a message related to the value. For example:

1;in range
8;in range
25;not in range 
5;in range

I have this code below but it is kind of unhandy;

awk -F";" 'OFS";" {if (($5=="1" || $5=="2" || $5=="3" || $5=="4" || $5=="5" || $5=="6" || $5=="7" || $5=="8" || $5=="9" || $5=="10" || $5=="11" || $5=="12" || $5=="13" || $5=="14" || $5=="15" || $5=="16") && $5!="") print $5 OFS "in range"}
{if (!($5=="1" || $5=="2" || $5=="3" || $5=="4" || $5=="5" || $5=="6" || $5=="7" || $5=="8" || $5=="9" || $5=="10" || $5=="11" || $5=="12" || $5=="13" || $5=="14" || $5=="15" || $5=="16") && $5!="") print $5 OFS "not in range"}'

since I created an array;

arr=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)

I tried to implement methods shown in here https://stackoverflow.com/a/15394738/14320738 like this but not succeeded:

awk -F";" 'OFS";" {if ($5=="${arr[*]}" && $5!="") print $5 OFS "in range"}
    {if (($5!="${arr[*]}" && $5!="") print $5 OFS "not in range"}'

Both array and awk command are under same script. I do not know how to do it with awk. Newbie here,

Thank you.

Edit: If there is a way to do with array method in awk I would appreciate that.

Edit 2: After helpful comments I come up to the conclusion that bash array can't be passed into awk array.

2
  • 2
    if you insist on using an array you would need to start by passing the array into awk via the -v flag (see this Q&A - Can I pass an array to awk using -v? - for a discussion on how this isn't as easy as it sounds); alternatively, if you'll be using the same (static) array all the time then you could define the array within awk (eg, in a BEGIN {...} block); but if you have just a few contiguous ranges then I'd probably tweak RavinderSingh13's answer to include the desired ranges Commented Sep 27, 2020 at 15:41
  • 1
    @AhmetSaidAkbulut : You have defined your Array as a bash array. You can't pass an bash array to an awk array. You could write the bash array to a file and read the file then into a bash array; or, since arr contains only numbers, you can turn it into an environment variable with all those number separated by a space, and inside awk split the content of this variable into an awk array. Commented Sep 28, 2020 at 7:26

2 Answers 2

4

IMHO you need not to create an array here, you could simply run a condition in awk and print statements accordingly.

awk -F';' '{if($5>=1 && $5<=16){print $5"; in range"} else{print $5";not in range"}}' Input_file
Sign up to request clarification or add additional context in comments.

4 Comments

Looks like you beat me by about 30 seconds :)
well this is pretty easy :D
I try to use array in awk. range can be A-Z as well.
@AhmetSaidAkbulut, with your shown samples you need not to use I believe, this simple condition will work here, cheers.
3

Use greater than and less than ...

awk -F";" '{ if ($5 >= 1 && $5 <= 10) print $5, "In range"; else print $5, "Not in range" }' <file>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.