-1

想像这样运行 Ruby

cat *.txt |my_print_last_line.rb

并打印每个文件的最后一行(如果我可以先打印,可能会做一些有趣的事情)

ARGF门课似乎很有希望解决它。试过这个:

ARGF.each do |line|
  last_line_of_file = line[last] 
  puts last_line_of_file
end

然而ARGF.each,似乎是所有文件连接的一长串,而不是单个文件。

4

1 回答 1

1

这与如何cat处理多个文件有关。它只是连接它们:

$ echo 'foo' > foo
$ echo 'bar' > bar
$ cat *
foo
bar

这意味着发出cat命令后,无法知道各个文件的开始和结束位置。如果你只是调用你的脚本,ruby my_print_last_line.rb *.txt你仍然会遇到同样的问题,因为 usingARGF也会简单地连接所有文件。

作为替代方案,您可以将文件名作为 ruby​​ 脚本的参数,以直接在 ruby​​ 中打开和读取文件:

ARGV.each do |file|
  puts IO.readlines(file).last
end

然后像这样调用你的脚本:

$ ruby my_print_last_line.rb *.txt

如果您正在阅读非常大的文件,您可能会通过使用seek基于方法获得显着的性能优势,如@DonaldScottWilde 在this answer to a similar question 中所述

于 2013-07-28T00:07:41.663 回答