【问题标题】:Perl: Add column from one file to the end of a second filePerl:将一个文件中的列添加到第二个文件的末尾
【发布时间】:2015-05-29 05:05:25
【问题描述】:

我想在 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

【问题讨论】:

    标签: perl substitution


    【解决方案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;
    

    【讨论】:

    • 感谢您的脚本。输入文件实际上非常大,所以我将它们读入大小数组,并按照发布的方式运行脚本,但输出不是 3 列。插入的列被放置在具有匹配数值的数据下。
    • 我意识到我的问题可能措辞不当,我已经编辑了示例输入文件以使其更清晰
    • @EA00 如果您将文件读入数组,您是否确定chomp 您的输入?文件中的换行符可能是导致您奇怪输出的原因。
    【解决方案2】:

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

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

    删除@ref = &lt;IN&gt; 并一次读取一行。

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

    【讨论】:

    • 感谢您的更正。我已相应地编辑了脚本并收到以下错误:在 ./script.pl 第 16 行, 第 5 行使用未初始化的值替换 (s///)。
    • 这意味着 $line2_columns[1] 是空白的。您的文件每列之间是否有多个空格?如果是这样,请尝试split /\s+/, $line2;
    • 谢谢,修复了错误,但是输出不在列中:11 aA12 bB13 cC14 dD。我应该实现推送功能吗?
    • @EA00 您的替换可能是替换包含换行符的空格。也许更改 while 循环的最后一行以将换行符放回原处,例如print OUT $line . "\n";
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多