0

Related to this question... return lines containing numbers in a range in a certain column return lines containing numbers in a range in a certain column

I know how to delete lines which contain numbers in a certain range. Then how to do if I want to delete lines only when the other column contains a number?

For example, I want to delete lines if the second column contains 4, and the third column contains numbers between 50 to 85? input

a 3 44 563
d 4 55 11 
e 2 93 445
r 4 82 44
e 4 93 33

output

a 3 44 563
e 2 93 445
e 4 93 33

I think we can do something like this... but this does not work.

awk '$2==4' & awk '$2 > 85 && $2 < 50' input > output

Can anybody know this? Of note, the second column contains only the integers from 1-22.

Thank you in advance!

0
4

This awk condition will print those lines:

awk '$2 != 4 || $3 > 85 || $3 < 50' input

It prints a line when the second column does not equal 4, or the third column is greater than 85, or the third column is less than 50.

This logical equivalent should have the same effect:

awk '! ($2 == 4 && $3 <= 85 && $3 >= 50)' input

As noted in comments, a clearer way to write the range comparisons for min <= num <= max would be min <= num && num <= max. So that would be:

awk '! ($2 == 4 && 50 <= $3 && $3 <= 85)' input
awk '$2 != 4 || $3 < 50 || 85 < $3' input
4
  • 2
    The common way to write the test for a number in a range is to put the number in the middle with the min value on the left and the max on the right, e.g. min <= num && num <= max, so the layout of your code clearly reflects it's purpose. You CAN obviously write it a bunch of other ways (e.g. as you have num <= max && num >= min) but that way is the clearest to read and hardest to write incorrectly.
    – Ed Morton
    Mar 28 at 13:37
  • 1
    Thanks @EdMorton! Should the same apply when testing for a number outside of a range: min > num || num > max?
    – rowboat
    Mar 28 at 17:36
  • 2
    That's not quite as obvious but num < min || max < num is the syntax that demonstrates that you're testing for num outside of a range as it literally has the word num on the outsides of the condition. So, to test for num inside a range you'd write min num num max and to test for num outside a range you'd write num min max num - the word "num" goes wherever it needs to be relative to the words "min"and "max".
    – Ed Morton
    Mar 28 at 18:27
  • I always put the variable on the left hand side when comparing. Find it much easier to read. For me this for example: var > min && var < max reads as if var is greater then then min and var is less then max.
    – ibuprofen
    Jun 8 at 4:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.