2015-05-27 90 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

相關問題