Say you have a list of increasing numbers and a threshold. How do you get the highest number smaller-or-equal to the threshold and all numbers that are larger?
Say you have a list of increasing numbers and a threshold. How do you get the highest number smaller-or-equal to the threshold and all numbers that are larger?
Let me show you what I mean by giving an example:
# Assume we have this list of increasing numbers 140 141 145 180 190 ... # If we pick 150 as threshold, the output should consist of 145 and all larger values: 145 180 190 ... # In the edge case where 150 itself is in the list, the output should start with 150: 150 180 190 ...
I guess one can always hack something together in awk with one or two track-keeper variables and a bit of control logic. However, is there a nicer way to do this, by using some nifty combination of simpler filters or awk functionalities?
One way would be to search for the line number n
of the first entry larger than the threshold, and then print all lines starting with n-1
. What command would be best suited for that?
Still, I'm also wondering: Can awk or any other standard tool do something like "for deciding whether to print this line, look at the next line"?
(In my use case, the list is short, so performance is not an issue, but maybe let's pretend that it were. Also, in my use case, all entries are unique, but feel free to work without this assumption.)
For the simpler case of threshold match and larger, with the list already ordered, you could use sed:
The edge case is tricky because "equal or lower" can't be expressed with regex cleanly, so even an awk solution would look kinda convoluted, so I personally prefer a for loop for readability's sake:
For the first code snippet to run correctly,
$list
would need to be put in double quotes:echo "$list" | ...
, because otherwiseecho
will conflate the various lines into a single line.The for loop approach is indeed quite readable.
To make it solve the original task (which here means that it should also assign a number just smaller than $threshold to $tail, if $threshold is not itself contained in $list), one will have to do something in the spirit of what @Ephera@lemmy.ml and I describe in these comments.The quoting oversight was due to me testing the first one only on zsh, which quotes differently.
The second was tested on Busybox ash and dash against the input in the example. It does assign a number just smaller or equal to threshold because head is overwritten on each iteration until it lands on the last value that was less than or equal to the threshold.