Home > Enterprise >  Matching a number against a comma-separated sequence of ranges
Matching a number against a comma-separated sequence of ranges

Time:02-10

I'm writing a bash script which takes a number, and also a comma-separated sequence of values and strings, e.g.: 3,15,4-7,19-20. I want to check whether the number is contained in the set corresponding to the sequence. For simplicity, assume no comma-separated elements intersect, and that the elements are sorted in ascending order.

Is there a simple way to do this in bash other than the brute-force naive way? Some shell utility which does something like that for me, maybe something related to lpr which already knows how to process page range sequences etc.

CodePudding user response:

Is awk cheating?:

$ echo -n 3,15,4-7,19-20 | 
  awk -v val=6 -v RS=, -F- '(NF==1&&$1==val) || (NF==2&&$1<=val&&$2>=val)' -

Output:

4-7

CodePudding user response:

A function based on @JamesBrown's method:

function match_in_range_seq {
    (( $# == 2 )) && [[ -n "$(echo -n "$2" | awk -v val="$1" -v RS=, -F- '(NF==1&&$1==val) || (NF==2&&$1<=val&&$2>=val)' - )" ]]
}

Will return 0 (in $?) if the second argument (the range sequence) contains the first argument, 1 otherwise.

  • Related