Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

getting the last word in each line

129 views
Skip to first unread message

Joe Van Dyk

unread,
Sep 12, 2006, 5:57:47 PM9/12/06
to
Is there a prettier way to read a file and return the last word in each line?

Here's my go:

File.read(some_file).to_a.map { |l| line.split.last }

What if I wanted to search the lines (based on a regex) and return the
last word in each line that satisfied the search criteria?

Joe

Vincent Fourmond

unread,
Sep 12, 2006, 6:18:44 PM9/12/06
to

Hello !

> File.read(some_file).to_a.map { |l| line.split.last }
>
> What if I wanted to search the lines (based on a regex) and return the
> last word in each line that satisfied the search criteria?

What about

File.read(some_file).to_a.map { |l| line.split.select {|v| v =~
/regex/}.last }

Vince


Ben Bleything

unread,
Sep 12, 2006, 6:24:12 PM9/12/06
to
On Wed, Sep 13, 2006, Joe Van Dyk wrote:
> Is there a prettier way to read a file and return the last word in each
> line?

Well, there's #readlines...

File.readlines('somefile').map {|f| f.split.last}

..which is a little nicer.

> What if I wanted to search the lines (based on a regex) and return the
> last word in each line that satisfied the search criteria?

File.readlines('somefile').map do |f|
next unless f =~ /regex/
f.split.last
end

But you'll have nils everywhere that a line was next'ed over...

File.readlines('somefile').reject{|f| f !~ /regex/}.map {|f| f.split.last}

Someone else might have an elegant solution, but these will work :)

Ben

Dominique Plante

unread,
Sep 12, 2006, 6:25:52 PM9/12/06
to
in irb:
>>r = /\w+$/
=> /\w+$/
>>s = "bad boy"
=> "bad boy"
>>md = s.match(r)
=> #<MatchData:0x2cae00c>
>>md[0]
=> "boy"


--
Posted via http://www.ruby-forum.com/.

Joel VanderWerf

unread,
Sep 12, 2006, 6:32:44 PM9/12/06
to
Joe Van Dyk wrote:
> File.read(some_file).to_a.map { |l| line.split.last }

line[/(\w+)\s*$/, 1]

might be faster than line.split.last. Worth trying anway.
--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

no...@ruby-lang.org

unread,
Sep 12, 2006, 7:24:12 PM9/12/06
to
Hi,

At Wed, 13 Sep 2006 06:57:47 +0900,
Joe Van Dyk wrote in [ruby-talk:214152]:
> File.read(some_file).to_a.map { |l| line.split.last }

$ ruby -e 'p open(ARGV[0]){|f|f.grep(/(\w+)\s*$/){$1}}' version.h
["190", "20060912", "1", "9", "0", "2006", "9", "12"]

--
Nobu Nakada

Logan Capaldo

unread,
Sep 12, 2006, 7:33:16 PM9/12/06
to
On Wed, Sep 13, 2006 at 07:18:44AM +0900, Vincent Fourmond wrote:
> What about
>
> File.read(some_file).to_a.map { |l| line.split.select {|v| v =~
> /regex/}.last }
That call to_a is unecessary. File.read(some_file).map { ... } will work
just as well.
>
> Vince
>

0 new messages