通过linux脚本或falcon:hadoop更新文本文件中的日期和时间

2q5ifsrm  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(261)

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

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日:则输出应为:output:

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 然后需要用结束时间更新开始时间--结束时间将是当前处理的日期:
有谁能帮我选择最好的方法来处理上述要求的文件。
我希望我的要求是明确的:)谢谢,马杜

ogq8wdun

ogq8wdun1#

您可以在shell脚本中执行此操作:
读取文件的每一行
回路
使用cut命令读取所需的字段值
if condition 检查字段值的步骤 name 以及 type 使用 sed 命令更新的值 starttime 以及 endtime 领域

tuwxkamq

tuwxkamq2#

纯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)

相关问题