想像这样运行 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
,似乎是所有文件连接的一长串,而不是单个文件。
想像这样运行 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
,似乎是所有文件连接的一长串,而不是单个文件。
这与如何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 中所述。