2015-05-27 91 views
0

我想从File1(A,B,C,D)的最后一列旁边添加特定的列(a,b,c,D) d)。示例输入和输出如下所示:Perl:将列从一个文件添加到第二个文件的末尾

Input File1: 
1 A 
2 B 
3 C 
4 D 

Input File2: 
11 a 
12 b 
13 c 
14 d 

Output: 
11 a A 
12 b B 
13 c C 
14 d D 

这是我的代码,我在指定替换正则表达式时遇到问题。也许有更好的方法一起做这件事?

#!/usr/bin/perl 

my $text = 'file1.txt'; 
my $column = 'file2.txt'; 

open IN, '<', $column or die "Can't open '$column' $!"; 
open TEXT, '<', $text or die "Can't open '$text' $!"; 
open OUT, '>>', 'output.txt' or die "Can't open 'output.txt' $!"; 

my @ref = <IN>; 

while (my $line = <TEXT>) { 
    $line =~ s/\s+$/$ref[1]/s; 
    print OUT $line; 
} 

更新:无法用perl解析。二手AWK代替:

awk -v f2=file2.txt ' { c = $2; getline < f2; print $0, c; } ' file1.txt > output.txt 

回答

1
use warnings; 
use strict; 


my @small = qw/a b c d e/; 
my @big = qw/A B C D E/; 

my %hash; 
@hash{@small} = @big; 

print "$_ $hash{$_}\n" foreach sort keys %hash; 
+0

谢谢你的脚本。输入文件实际上是相当大的,所以我把它们读入数组中,然后运行脚本,但输出不在3列。插入的列将被放置在具有匹配数值的数据下。 – EA00

+0

我意识到我的问题可能措辞不佳,我编辑了示例输入文件以使其更清晰 – EA00

+0

@ EA00如果您正在将文件读入阵列,您是否确保“chomp”输入?文件中的换行符可能是导致您的怪异输出的原因。 – Zippers

0

。在你的代码中的问题,@ref = <IN>将会把文件的每一行作为@ref数组的元素。然后,在循环的每次迭代中,尝试插入文件的第二行$ref[2]。这显然不是你想要的。

您也错过了按列分割行数。最后,记住数组索引从零开始,所以如果你想要第二列,你正在寻找元素1.

删除@ref = <IN>并一次只读一行。

while (my $line = <TEXT>) { 
    my $line2 = <IN>; 
    my @line2_columns = split /\s/, $line2; 
    $line =~ s/\s+$/$line2_columns[1]/s; 
    print OUT $line; 
} 
+0

感谢您的更正。我编辑了相应的脚本,出现以下错误:使用未初始化的值替换(s ///)在./script.pl第16行,第5行。 – EA00

+1

这意味着$ line2_columns [1]为空。您的文件在每列之间是否有多个空格?如果是这样,请尝试'split/\ s + /,$ line2;'而不是。 –

+0

谢谢,修正了错误,但输出不在列中:11 aA12 bB13 cC14 dD。我应该实施推送功能吗? – EA00

相关问题