通过 Linux 脚本或 falcon 更新文本文件中的日期和时间:Hadoop
Update date and time in text file via Linux script or falcon : Hadoop
我有一些包含以下条目的文本文件:
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
然后需要用结束时间更新开始时间 -- 结束时间将是处理的当前日期:
任何人都可以帮助我选择最佳方法来处理具有上述要求的文件。
我希望我的要求被清除:)
谢谢,
马杜
您可以在 shell 脚本中完成:
- 读取文件的每一行
- 循环
- 使用 cut 命令读取所需的字段值
- 执行
if condition
检查字段 name
和 type
的值
- 使用
sed
命令更新 starttime
和 endtime
字段的值
纯 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)
我有一些包含以下条目的文本文件:
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
然后需要用结束时间更新开始时间 -- 结束时间将是处理的当前日期:
任何人都可以帮助我选择最佳方法来处理具有上述要求的文件。
我希望我的要求被清除:) 谢谢, 马杜
您可以在 shell 脚本中完成:
- 读取文件的每一行
- 循环
- 使用 cut 命令读取所需的字段值
- 执行
if condition
检查字段name
和type
的值
- 使用
sed
命令更新starttime
和endtime
字段的值
纯 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)