【问题标题】:Replace column value with another column's value conditionally perl [closed]有条件地用另一列的值替换列值 perl [关闭]
【发布时间】:2023-03-15 20:48:01
【问题描述】:

我正在处理由制表符分隔的非常大数据的多个文件。每一行都有一个日期是非常重要的,但有些只包含一个值“0”。在文件中,如果所需的日期列是“0”,则可以使用附加的日期列。如何将具有“0”值的列替换为附加日期列的值?我的示例数据如下。

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

【问题讨论】:

  • 比较需要使用===是赋值运算符。 perlop#Equality
  • @HunterMcMillen 当我使用 if ($F[2] == 0) 而不是 if ($F[2] = 0) 我得到 "Desired_date12/23/2014" 作为我的输出和其余的数据被吹走。它仍在识别 $F[2] 的值为“0”,但不是简单地将 Desired_date 归档。
  • 如果你更新问题中的代码,它的可读性会好很多。

标签: perl split conditional-statements


【解决方案1】:

你的代码有两个问题:

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

工作代码:

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

【讨论】:

  • 当然!!分手后重新加入!效果很好!
  • 还有一个问题。假设数据有空字段,即 ('2345',\t','\t','joejohn') 并且空字段被省略并返回即 ('2345','\t','joejohn') .有什么办法可以预防吗?
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2014-08-23
  • 2015-02-01
  • 2018-10-18
  • 2019-02-03
相关资源
最近更新 更多