【问题标题】:Update date and time in text file via Linux script or falcon : Hadoop通过 Linux 脚本或 falcon 更新文本文件中的日期和时间:Hadoop
【发布时间】:2016-03-18 07:34:45
【问题描述】:

我有一些包含以下条目的文本文件:

Name  type  startTime   Endtime    comments
my   I      01-03-2016  02-03-2016 zoom
my   F     01-03-2016  02-03-2016  zoom2
abd   F     03-03-2016  04-03-2016  zoom5
my   I      01-03-2016  02-03-2016 zoom6 

如果当前日期是 3 月 18 日:输出应该是: 输出:

Name  type  startTime   Endtime    comments
my   I      **02-03-2016**  ***18-03-2016*** zoom
my   F     01-03-2016  02-03-2016  zoom2
abd   F     03-03-2016  04-03-2016  zoom5
my   I      **02-03-2016**  ***18-03-2016*** zoom6 

条件是If name == my && type ==I 然后需要用结束时间更新开始时间 -- 结束时间将是处理的当前日期:

谁能帮助我选择最佳方法来处理具有上述要求的文件。

我希望我的要求被清除 :) 谢谢, 马杜

【问题讨论】:

  • 使用 Text::CSV 将文件解析成哈希,处理,然后写回
  • 你能详细说明你的答案吗?感谢您的快速回复:

标签: linux perl hadoop oozie falcon


【解决方案1】:

纯 Perl 解决方案看起来像

#!/usr/bin/env perl

use strict;
use warnings;

open(my $fh, "<", "file.txt") || die $!;
my ($header, @lines) = <$fh>;
close($fh);

my @keys = split(/[\s\t]+/, $header);

open($fh, ">", "file.txt") || die $!;
print $fh join("\t",@keys), "\n";

my @cdate = (localtime)[3,4,5];
$cdate[1] += 1;
$cdate[2] += 1900;

foreach my $line (@lines) {
    my %tmp;
    @tmp{@keys} = split(/[\s\t]+/, $line);
    if($tmp{'Name'} eq 'my' && $tmp{'type'} eq 'I') {
        $tmp{'Endtime'} = sprintf("%02d-%02d-%04d", @cdate)
    }

    print $fh join("\t", @tmp{@keys} ),"\n"
}

close($fh)

【讨论】:

  • 谢谢 Sotona .. 对你的回答印象深刻 :) .. 我对 perl 很陌生,但我理解逻辑.. 如果我没有标题,你能帮我 smalle sn-p 吗..what可能是代码的变化。 -- 非常感谢
  • 如果你没有标题,你必须确保所有的列都有固定的位置。在这种情况下,您必须将每一行拆分为一个数组,然后检查 if ($array[0] eq 'my' &amp;&amp; $array[1] eq 'I') 然后 $array[3] = current date
  • 您好 sotona,perl 脚本无法从 falcon 运行。你能在 Linuxscript 中进行相同的转换吗,提前谢谢??
  • 什么是猎鹰?你有哪个版本的 Perl?
  • Falcon 是一个 hadoop 数据治理和作业调度程序。 Perl 版本 v5.10.1 (*) 。独立脚本运行良好.. :) 感谢您的快速响应。可能是 perl 软件包在 Falcon 中不可用。如果可能的话,您能否在 Linux 脚本中进行转换
【解决方案2】:

您可以在 shell 脚本中执行此操作:

  1. 读取文件的每一行
  2. 循环
  3. 使用 cut 命令读取必填字段值
  4. 执行if condition 检查字段nametype 的值
  5. 使用sed 命令更新starttimeendtime 字段的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 2015-02-28
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    相关资源
    最近更新 更多