Ruby 如何将一列两个文件合并为一列两个文件

Ruby 如何将一列两个文件合并为一列两个文件,ruby,perl,apache-pig,Ruby,Perl,Apache Pig,我有一个文件是 A B C 二是 100 101 102 我想在PigLatin中合并这两个文件(即,将第一列与第一列合并) A 100 B 101 C 102 非常简单: File.write('first_file',<<_) A B C _ File.write('second_file',<<_) 100 101 102 _ 然后,我使用方法在写入模式下打开文件new\u file。阅读理解,为什么

我有一个文件是

A  
B   
C
二是

100  
101  
102  
我想在PigLatin中合并这两个文件(即,将第一列与第一列合并)

A 100      
B 101  
C 102 
非常简单:

File.write('first_file',<<_)
A  
B   
C
_
File.write('second_file',<<_)
100  
101  
102
_
然后,我使用方法在写入模式下打开文件
new\u file
。阅读理解,为什么我使用这种方法

File.open('new_file','w') do |file|
    ary1.zip(ary2) do |a|
        file.write(a.join(" ")+"\n")
    end
end
方法对指定的
I/O
端口中的每一行执行块,其中的行由
sep


这很好用,可能值得一看。它希望输入文件的路径作为命令行上的参数

use strict;
use warnings;
use autodie;

my @fh = map {
  open my $fh, '<', $_;
  $fh;
} @ARGV;

while (grep { not eof $_ } @fh) {
  my @columns = map <$_> // 'empty', @fh;
  chomp @columns;
  print "@columns\n";
}

为什么您有
ruby
perl
标记?请展示您尝试过的内容。我们需要查看您无法开始工作的程序。使用
RANK
JOIN
。这个问题似乎离题了,因为这是一个编写代码的请求,没有明显的研究或努力。为什么要编写晦涩难懂的
map(&:strip)
而不是
map{line | line.strip}
?我不知道<代码>地图(&:strip)就是你写的。首先,你告诉我,为什么它晦涩难懂?你发现我第一个使用
地图(&:strip)
?-1来表示不必要的神秘吗code@Borodin可以我接受了。。你的-1。。很高兴。这基本上是一个不错的答案,但是
File::Slurp
不是核心模块,需要安装。如果不确定文件小于几GB,你就不应该推荐它。@Borodin是的,我决定追求简洁明了,因此我认为必须安装对某些人来说是可以的。对于这样的案例来说,这是一个很好的模块。它还需要安装在我的系统上,因为核心提供的版本没有pairmap。我喜欢你的风格,把它带到一般情况下。顺便说一句,我认为
while(grep{not eof}@fh==0){
循环如果写为
until(grep{eof}@fh),可读性会稍微好一些{
。我不经常发现这样的情况,直到感觉比while好,但我认为这是一个。@Miller:鉴于OP的问题相当奇怪,我想这是一个玩笑。但是你对
while
条件的看法是对的,因为它完全错了,我忘了回去修复它。你的修复不是我想要的,因为它循环直到任何一个文件处于eof。我本想循环直到所有文件都处于eof,并修复下一行中的空列。但结果太混乱了,所以我还是这样做了,并让警告谈论不匹配的文件。@Miller:除非文件数未知,否则请不要将其用作模式。映射arra一个文件句柄数组的文件路径y是可以的,但是别忘了错误处理!@Miller:我的
grep{not eof}@fh
中还有另一个bug,因为
eof
eof()
eof($\uf)
之间有区别,我猜错了默认值。另一个警告是不要太聪明了!
File.foreach('new_file') do |line|
  puts line
end
# >> A 100
# >> B 101
# >> C 102
use File::Slurp qw(read_file write_file);
use List::Util qw(pairmap);

use strict;
use warnings;

chomp(my @file1 = read_file('file1.txt'));
chomp(my @file2 = read_file('file2.txt'));

write_file('outfile.txt', pairmap { "$a $b\n" } @file1, @file2);
use strict;
use warnings;
use autodie;

my @fh = map {
  open my $fh, '<', $_;
  $fh;
} @ARGV;

while (grep { not eof $_ } @fh) {
  my @columns = map <$_> // 'empty', @fh;
  chomp @columns;
  print "@columns\n";
}
A 100
B 101
C 102