6

I've got a file with QR-code lines and I want to grep for only those whose subsequences do not increase in length. Example:

This one is good because the next sequence is less or same as previous:

####### ###### ### ### ## # # #

This one is wrong:

### ## ## ### ### ### ###### ##

I started off like this:

egrep "[^#](####)+[ ]+(##)+" qr.txt

but then I realised it's going to be impossible to continue..

1
  • I updated your question to help clarify the requirement - do you mean that each chunk of #'s should have no more than (same as, or fewer) #'s than the previous chunk?
    – Jeff Schaller
    Dec 22, 2015 at 16:59

2 Answers 2

11
grep -vE '(^| )(#+) .*\2#' <<END
####### ###### ### ### ## # # #
### ## ## ### ### ### ###### ##
END
####### ###### ### ### ## # # #
5
  • Nice, but I think he wants the opposite, so grep -v ....
    – jimmij
    Dec 22, 2015 at 17:03
  • yes. i think so too. i think maybe (since it is clearer now) you can drop the # after \2 - if \2 is found again at all the sequence doesn't decrease. \2# only finds the increase.
    – mikeserv
    Dec 22, 2015 at 17:05
  • Very neat solution +1, but I think you should invert the match with -v.
    – chaos
    Dec 22, 2015 at 17:07
  • 1
    @mikeserv, the requirements clearly state "the next sequence is less or same as previous" is "good" -- \2# is required Dec 22, 2015 at 17:10
  • that's a good point - i contest its clarity considering the previous paragraph requires sequences which decrease in length. either way, it is a good answer.
    – mikeserv
    Dec 22, 2015 at 17:21
3

With awk:

awk '{l=length($1);for(i=2;i<=NF;i++){if(length($i)>l){next};l=length($i)}}1' file
  • l=length($1) sets the varibale l to the length of the first field.
  • for(i=2;i<=NF;i++) loops trough all fields starting at the second.
  • if(length($i)>l if the length of that field is greater than the length of the last field:
    • next; skip to the next line.
  • l=length($i) set the l variable for the next iteration.

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.