Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby打印文件的最后一行,其中的文件是从stdin re direction提供的_Ruby - Fatal编程技术网

Ruby打印文件的最后一行,其中的文件是从stdin re direction提供的

Ruby打印文件的最后一行,其中的文件是从stdin re direction提供的,ruby,Ruby,想这样运行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。每个似乎都是一个连接的所有文件的长字符串,而不是单个文件。这与cat如何处理多个文件有关。它只是将它们连接起来

想这样运行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。每个
似乎都是一个连接的所有文件的长字符串,而不是单个文件。

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

$ echo 'foo' > foo
$ echo 'bar' > bar
$ cat *
foo
bar
这意味着在发出
cat
命令后,无法知道各个文件的开始和结束位置。如果您只是以
ruby my\u print\u last\u line.rb*.txt
的形式调用脚本,您仍然会遇到同样的问题,因为使用
ARGF
也会简单地连接所有文件

或者,您可以将文件名作为ruby脚本的参数,直接在ruby中打开和读取文件:

ARGV.each do |file|
  puts IO.readlines(file).last
end
然后像这样调用脚本:

$ ruby my_print_last_line.rb *.txt

如果您正在读取非常大的文件,那么您可以使用基于
搜索
的方法获得显著的性能优势,正如@donaldscottwide在中所述。

为什么不改为
my\u print\u last\u line.rb*.txt
ARGF
也只是连接文件。何时需要递归运行它呢:例如find-名称“*.txt”|我的打印最后一行。RB那不是。请更具体地说明问题所在,应该按原样工作!运行Ruby on.txt只会扩展cwd中的文件,如果我想在树中的所有文件上运行一个由>find生成的文件,该怎么办-name“.txt”您可以通过
find
使用
-exec
标志运行脚本:
find-名称“*.txt”-exec ruby my_print_last_line.rb{}\从dos提示符在windows下运行。获取以下错误/test.rb:第2行:意外标记附近的语法错误
('test.rb:第2行:
放置IO.readlines(文件).last'按如下方式运行:find.-name“*.txt”-exec test.rb{};test.rb是您提供的3行代码。顺便说一句,运行Ruby 1.93