2014-07-25 113 views
1

我正在处理由选项卡分隔的非常大的数据的多个文件。每行都有一个日期,但有些只包含'0'值是非常重要的。在文件中,如果期望的日期列为'0',则可以使用额外的日期列。如何用附加日期列的值替换“0”值的列?我的示例数据如下。另外下面有条件地将列值替换为另一列的值perl

ID NAME Desired_Date Additional_Date 
1234 jimbob 0 12/23/2014 
2345 joejohn 12/30/2014 12/31/2014 

是我想要的输出:

ID NAME Desired_Date Additional_Date 
1234 jimbob 12/23/2014 12/23/2014 
2345 joejohn 12/30/2014 12/31/2014 

因此,大家可以看到,我想了额外的日期复制在需要的日期是“0”。我有一些我尝试过的代码,但它似乎没有做到这一点。

while (<>) { 
    my @F = split; 
    if ($F[2] == 0) { 
     print $F[2] = $F[3]; 
    } 
} 
print "@F\n"; 

的电流输出为:

Desired_date12/23/2014 
+1

你需要使用'=='进行比较,'='是赋值运算符。['perlop#Equality'](http://perldoc.perl.org/perlop.html#Equality-Operators) –

+0

@HunterMcMillen当我使用如果($ F [2] == 0)而不是if($ F [2] = 0),我得到“Desired_date12/23/2014”作为我的输出,其余的数据都被吹走了。 $ F [2]的值为' 0“,但不是简单地将Desired_date域移动过来。 – JDE876

+0

如果您更新问题中的代码,它将更具可读性。 –

回答

0

两个问题与您的代码:

  1. 当该字段为0,你应该只复制替代值 - 而不是同时打印结果的任务。
  2. 您需要打印每次读(行不管你是否修改您当前print "@F\n"是外循环,所以它只能运行一次

工作代码:。

while (<>) { 
    my @F = split; 
    if ($F[2] == 0) { 
     $F[2] = $F[3]; 
    } 
    print join("\t", @F) . "\n"; 
} 
+0

当然!!拆分后重新加入!很棒! – JDE876

+0

还有一个问题。假如数据有空字段,即('2345',\ t','\ t','joejohn'),并且空字段被省略并且回滚,即('2345','\ t','joejohn') 。有什么办法可以防止这种情况发生? – JDE876

相关问题