Perl 当条件为true时,将值从一个文件复制到另一个文件

Perl 当条件为true时,将值从一个文件复制到另一个文件,perl,Perl,我有两张桌子。如果满足某个条件,我想将值从一个文件复制到另一个文件。一切都是这样的 表1 C1 C2 C3 1 a b 3 e f 表2 C1 C2 ... ... C7 C8 ... 1 2 3 表2应如下所示: C1 C2 ... ... C7 C8 ... 1 x=b

我有两张桌子。如果满足某个条件,我想将值从一个文件复制到另一个文件。一切都是这样的

表1

C1    C2    C3
1     a     b
3     e     f
表2

C1    C2    ...  ...    C7    C8 ...
      1          
      2
      3
表2应如下所示:

C1    C2    ...  ...    C7    C8 ...
      1                       x=b  
      2          
      3                       x=f
因此,如果C1(表1)和C2(表2)的值相同,那么表1中C3的值应该放在表2的C8列中。C8中的新值均应以“x=”开头,后跟表1中的相应值

这是我目前用来打开数据的脚本

my $data1 = $ARGV[0];
my $data2 = $ARGV[1];

unless ($data1) {
    print "Enter filename:\n";
    $data1 = <STDIN>;
    chomp $data1;}
open(DATA1,'<',$data1) or die "Could not open file $filename $!";

unless ($data2) {
    print "Enter filename:\n";
    $data2 = <STDIN>;
    chomp $data2;}
open(DATA2,'<',$data2) or die "Could not open file $filename $!";

while (<DATA1>) {
    my @columns = split /\s+/;
    next  if /^\s*C/;
      # I'm doing some transformations here so that my input DATA1 has the format of  table 1 in my example
    }

foreach $c1(sort {$a<=>$b} keys %info ) {
    print $c1, "\t", 
      join(',',@{$info{$c1}->{variant}}), "\t", 
      join(',',@{$info{$c1}->{frequency}}), "\n";
# so $c1 is actually how table 1 in my example looks like
}

my %hash;

while($c1){
     my @columns = split;
     $hash{$columns[0]} = [$columns[2]];
     }

while (<DATA2>) {
     my @columns = split;               
     $columns[7] = @{ $hash{ $columns[0] } }[2] if exists $hash{ $columns[0] };
     print "\t", join (@columns), "\n";
     }
my$data1=$ARGV[0];
my$data2=$ARGV[1];
除非($data1){
打印“输入文件名:\n”;
$data1=;
chomp$data1;}
打开(数据1,{variant}),“\t”,
连接(“,”,@{$info{$c1}->{frequency}),“\n”;
#所以$c1实际上是我示例中的表1的样子
}
我的%hash;
而(c1美元){
我的@columns=split;
$hash{$columns[0]}=[$columns[2]];
}
而(){
我的@columns=split;
$columns[7]=@{$hash{$columns[0]}[2],如果存在$hash{$columns[0]};
打印“\t”,连接(@列),“\n”;
}
这是提供了@choroba解决方案的脚本。但是一定有什么问题,因为我没有得到任何的输出在屏幕上


复制值时如何添加语句“x=”

使用散列来记住第一个文件

#!/usr/bin/perl
use warnings;
use strict;
use feature qw(say);

my ($data1, $data2) = @ARGV;

open my $T1, '<', $data1 or die $!;
my %hash;
while (<$T1>) {
    my @fields = split;
    $hash{$fields[0]} = [ @fields[ 1, 2 ] ];
}

open my $T2, '<', $data2 or die $!;
while (<$T2>) {
    my @fields = split;
    @fields[1, 2] = @{ $hash{ $fields[0] } }[0, 1] if exists $hash{ $fields[0] };
    say join "\t", @fields;
}
#/usr/bin/perl
使用警告;
严格使用;
使用特征qw(例如);
my($data1,$data2)=@ARGV;

打开我的$T1,“您可以对第一个文件使用哈希来执行此操作:

my %columns1;
while (<DATA1>) {
    my @c = split /\s+/;
    $columns1{$c[0]} = [ @c ];
    next  if /^\s*C/;}
my %columns2;
while (<DATA2>) {
     my @c = split /\s+/;
     if (defined $columns1{$c[0]}) {
        $c[1] = $columns1{$c[0]}[1];
        $c[2] = $columns1{$c[0]}[2];
     }
     $columns2{$c[0]} = [ @c ];
}
my%列1;
而(){
my@c=split/\s+/;
$columns1{$c[0]}=[@c];
下一个if/^\s*C/;}
我的%columns2;
而(){
my@c=split/\s+/;
if(定义为$columns1{$c[0]}){
$c[1]=$columns1{$c[0]}[1];
$c[2]=$columns1{$c[0]}[2];
}
$columns2{$c[0]}=[@c];
}

表2是否总是只包含表1的前3列,或者表2是否也可以包含例如C1、C4、C6列?我刚刚编辑了文件,使其看起来更像真实情况。@user1987607:您可能使用了非常旧的Perl版本。删除
功能
行,使用
打印
而不是
,只需在每个输出行的末尾添加
“\n”
。现在,我在打印
打印联接(“\t”,@fields)、“\n”附近发现语法错误语法错误已修复。我已经改变了你在我原来的帖子中提出的事情。你能看一下我的剧本吗,因为还有一些地方不对劲