我想在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
答案 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;
}