Perl:将列从一个文件添加到第二个文件的末尾

时间:2015-05-27 19:25:05

标签: perl substitution

我想在File2(a,b,c,D)的最后一列旁边的File1(A,B,C,D)中添加一个特定的列。示例输入和输出如下所示:

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;
}