gpt4 book ai didi

perl - 从包含日期的文件中排序并提取一定数量的行

转载 作者:行者123 更新时间:2023-12-05 09:03:29 26 4
gpt4 key购买 nike

我有一个 txt 文件,日期如下:

yyyymmdd

原始数据是这样的:

20171115
20171115
20180903
...
20201231

它们超过 10 万行。我试图将“最新”的 10k 行保存在一个文件中,并将 10k“最旧”的 10k 行保存在一个单独的文件中。

我想这一定是一个两步过程:

  1. 排序行,

  2. 然后提取顶部的 10k 行,“最新 = 最近日期”和接近文件末尾的 10k 行,即“最旧 = 最古老的日期”

我如何使用 awk 实现它?

虽然我什至尝试过使用 perl 但没有成功,所以 perl one liner 也会被高度接受。

编辑:我更喜欢一个干净聪明的解决方案,以便我从中学习,而不是我尝试的优化。

perl 示例

@dates = ('20170401', '20170721', '20200911');
@ordered = sort { &compare } @dates;
sub compare {
$a =~ /(\d{4})(\d{2})(\d{2})/;
$c = $3 . $2 . $1;
$b =~ /(\d{4})(\d{2})(\d{2})/;
$c = $3 . $2 . $1;
$c <=> $d;
}
print "@ordered\n";

最佳答案

这是一个使用 的答案.如果您希望最早的排在最前面,您可以使用标准排序顺序:

@dates = sort @dates;

反向排序,最新的在最上面:

@dates = sort { $b <=> $a } @dates;
# ^^^
# |
# numerical three-way comparison returning -1, 0 or +1

然后您可以从顶部提取 10000 个条目:

my $keep = 10000;
my @top = splice @dates, 0, $keep;

从底部开始 10000:

$keep = @dates unless(@dates >= $keep);
my @bottom = splice @dates, -$keep;

@dates 现在将包含您提取的顶部 10000 和底部 10000 之间的日期。

如果需要,您可以将这两个数组保存到文件中:

sub save {
my $filename=shift;
open my $fh, '>', $filename or die "$filename: $!";
print $fh join("\n", @_) . "\n" if(@_);
close $fh;
}

save('top', @top);
save('bottom', @bottom);

关于perl - 从包含日期的文件中排序并提取一定数量的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69978477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com