Is there an easier way to use Rx's GroupBy operator?
You could use also use a counter provider per grouping observable, in the form of zipping a large stream of integers, like so:

static void Main(string[] args)
{
    var input = GetConsoleLines().ToObservable().TakeWhile(line =&gt; !string.IsNullOrEmpty(line));
    input.GroupBy(word =&gt; word)
         .SelectMany(grouping =&gt; grouping.Zip(Observable.Range(1, int.MaxValue), (s, i) =&gt; new Tuple&lt;string, int&gt;(s, i)))
         .Subscribe(r =&gt; Console.WriteLine($"you typed {r.Item1} {r.Item2} times"));
}

public static IEnumerable&lt;string&gt; GetConsoleLines()
{
    while(true)
        yield return Console.ReadLine();
}