Skip to content

Instantly share code, notes, and snippets.

@frgomes
Last active November 29, 2017 14:25
Show Gist options
  • Select an option

  • Save frgomes/18c88ccfa9b733b8a8f8d970641fc798 to your computer and use it in GitHub Desktop.

Select an option

Save frgomes/18c88ccfa9b733b8a8f8d970641fc798 to your computer and use it in GitHub Desktop.
Scala - grep-like processing a list of inclusions and a list of exclusions
//-------------------------------------------------------------------------------------------------
// This would be something equivalent to:
// $ cat inputs.txt | fgrep -f includes.txt | fgrep -v -f excludes.txt | uniq | sort
//-------------------------------------------------------------------------------------------------
import scala.util.matching.Regex
def grep(inputs: Seq[String], includes: Set[Regex], excludes: Set[Regex], sort: Boolean = false, uniq: Boolean = false): Iterable[String] = {
def pass(s: String, set: Set[Regex]): Boolean = set.exists(r => r.findFirstIn(s).isDefined)
val grep1: Iterable[String] = if(includes.size==0) inputs else for { c <- inputs if(pass(c, includes)) } yield { c }
val grep2: Iterable[String] = if(excludes.size==0) grep1 else for { c <- grep1; e <- excludes if(!pass(c, excludes)) } yield { c }
val unique: Iterable[String] = if(uniq) grep2.toSet else grep2
val sorted: Iterable[String] = if(sort) unique.toSeq.sorted else unique
sorted
}
@frgomes
Copy link
Author

frgomes commented Jul 1, 2016

Example of use:

val inputs  = Seq("a.b.c1", "a.b.c2", "a.z.x1", "a.z.x2", "a.zero.j1", "a.zero.j2", "aaa.b.c")
val includes = Set("^a[.]").map(s => s.r)
val excludes = Set("^a[.]zero", "^a[.]z").map(s => s.r)
val sort = true
val uniq = true
val result = grep(inputs, includes, excludes, sort, uniq)
// result: Iterable[String] = ArrayBuffer("a.b.c1", "a.b.c2")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment