Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 文件的排序数组';s根据文件中第一行的值命名_Perl_Bash_Sorting - Fatal编程技术网

Perl 文件的排序数组';s根据文件中第一行的值命名

Perl 文件的排序数组';s根据文件中第一行的值命名,perl,bash,sorting,Perl,Bash,Sorting,我有n个文件的数组输入文件 INPUTFILES=( file_0 ... files_n-1 ) 我需要按文件中第一行的数组顺序对它们进行排序 文件如下所示: 2012.09.20 17:10 2012.11.21 00:10 2012.12.22 15:10 2012.12.23 15:10 我已经完成了比较2个文件的功能: IsSooner () { ONEFIRST=$( head -1 "${1}" ) ONELAST=$( tail -1 "${1}" ) TWOFIRST=$

我有n个文件的数组输入文件

INPUTFILES=( file_0 ... files_n-1 )
我需要按文件中第一行的数组顺序对它们进行排序

文件如下所示:

2012.09.20 17:10
2012.11.21 00:10
2012.12.22 15:10
2012.12.23 15:10
我已经完成了比较2个文件的功能:

IsSooner () {
ONEFIRST=$( head -1 "${1}" ) 
ONELAST=$( tail -1 "${1}" )
TWOFIRST=$( head -1 "${2}" ) 
TWOLAST=$( tail -1 "${2}" )

TIMEFORMAT='Y.%m.%d %H:%M:'

perl <<EOF
use strict;
use warnings;

use Time::Piece;

open STDERR, "> /dev/null";

my @dates1 = ("${ONEFIRST}","${ONELAST}");
my @range1 = map Time::Piece->strptime("\$_", "${TIMEFORMAT}"), @dates1;

my @dates2 = ("${TWOFIRST}","${TWOLAST}");
my @range2 = map Time::Piece->strptime("\$_", "${TIMEFORMAT}"), @dates2;

if ( \$range1[0] < \$range2[0] ) {
  exit 0;
}

exit 1;
EOF

[ $? -eq 0 ] && {
  return 0
}

return 1  
}
IsSooner(){
ONEFIRST=$(头-1“${1}”)
最后一个=$(尾部-1“${1}”)
TWOFIRST=$(头-1“${2}”)
TWOLAST=$(尾部-1“${2}”)
TIMEFORMAT='Y.%m.%d%H:%m:'
perl strtime(“\$\”,“${TIMEFORMAT}”),@dates1;
my@dates2=(${TWOFIRST},“${TWOLAST}”);
我的@range2=map Time::Piece->strtime(“\$\”,“${TIMEFORMAT}”),@dates2;
如果(\$range1[0]<\$range2[0]){
出口0;
}
出口1;
EOF
[$?-等式0]&&{
返回0
}
返回1
}
越早是文件中的第一个日期,数组中较小的索引将具有

如果愿意,可以在BASH中解决

更新 我事先不知道日期的格式。我只知道它将是strftime(3c)格式

  • 在简单循环中,读取每个文件的第一行并将此信息保存到哈希中,第一行数据具有哈希键,文件名具有哈希值

    my @inpufiles = ...;
    my %hash;
    foreach (@inputfiles) {
      open(my $fh, $_) or die $!;
      $hash{<$fh>} = $_;
      close $fh;
    }
    
    如果不想打印,只需将其存储回阵列,然后

    @inputfiles = map {$hash{$_}} sort (keys(%hash));
    
  • 祝你好运


    [更新]

    要跟踪问题中的更新,我建议您使用以下方法存储要散列的值:

    $hash{Time::Piece->strptime(<$fh>, $timeformat)->epoch} = $_;
    
    $hash{Time::Piece->strtime(,$timeformat)->epoch}=$;
    
  • 在简单循环中,读取每个文件的第一行并将此信息保存到哈希中,第一行数据具有哈希键,文件名具有哈希值

    my @inpufiles = ...;
    my %hash;
    foreach (@inputfiles) {
      open(my $fh, $_) or die $!;
      $hash{<$fh>} = $_;
      close $fh;
    }
    
    如果不想打印,只需将其存储回阵列,然后

    @inputfiles = map {$hash{$_}} sort (keys(%hash));
    
  • 祝你好运


    [更新]

    要跟踪问题中的更新,我建议您使用以下方法存储要散列的值:

    $hash{Time::Piece->strptime(<$fh>, $timeformat)->epoch} = $_;
    
    $hash{Time::Piece->strtime(,$timeformat)->epoch}=$;
    
    您可以使用对文件列表进行排序:

    my @inputfiles =
      map  { $_->[0] }
      sort { $a->[1] cmp $b->[1] }
      map  { [ $_, do { open my($f), $_; chomp(my $time = <$f>); $time } ] }
        qw/file_0 file_1 file_2/;
    
    您可以使用对文件列表进行排序:

    my @inputfiles =
      map  { $_->[0] }
      sort { $a->[1] cmp $b->[1] }
      map  { [ $_, do { open my($f), $_; chomp(my $time = <$f>); $time } ] }
        qw/file_0 file_1 file_2/;
    

    如果我理解的话,你想用shell替换perl吗?不。perl片段是必需的。我只需要重新排列数组输入文件中的顺序。我只是添加了比较函数,因为要设置集合的顺序,必须有可比较的项。为什么需要perl?它似乎做了比必要的更多的工作(为什么要读取每个文件的最后一行?),除了比较前两行之外,它什么也不做。我说,按照user1215106的答案去做。@tuxuday是的,我正在寻找正确的解决方案。第一个想法是使用关联数组,但我不确定。@chepner这是必要的,因为我没有固定的日期格式(在示例中是)。bash/nawk没有strptime()等价物。如果我理解,您想用shell替换perl吗?没有。perl片段是必需的。我只需要重新排列数组输入文件中的顺序。我只是添加了比较函数,因为要设置集合的顺序,必须有可比较的项。为什么需要perl?它似乎做了比必要的更多的工作(为什么要读取每个文件的最后一行?),除了比较前两行之外,它什么也不做。我说,按照user1215106的答案去做。@tuxuday是的,我正在寻找正确的解决方案。第一个想法是使用关联数组,但我不确定。@chepner这是必要的,因为我没有固定的日期格式(在示例中是)。bash/nawk没有等价的strptime()。这是按词汇排序的,对吧。如果是,这对我没有帮助。这是因为我正在使用Time::Piece对象相互比较。@Rob-其他用户已经在您的问题下面写了评论,其中注意到您不需要按自定义排序对数据进行排序,因为您的数据是“YYYY.MM.DD HH:NN”格式和“词汇”格式的排序是这种格式的正确解决方案…只需将
    $hash{}=$\uu
    更改为规范化值所需的任何值。我建议从epoch开始规范化为秒。如果第一行相同,此解决方案将删除输入文件。这可能是一个真正的问题,因为时间戳通常不是唯一的。这是按词汇排序的,对吗。如果是,这对我没有帮助。这是因为我正在使用Time::Piece对象相互比较。@Rob-其他用户已经在您的问题下面写了评论,其中注意到您不需要按自定义排序对数据进行排序,因为您的数据是“YYYY.MM.DD HH:NN”格式和“词汇”格式的排序是这种格式的正确解决方案…只需将
    $hash{}=$\uu
    更改为规范化值所需的任何值。我建议从epoch开始规范化为秒。如果第一行相同,此解决方案将删除输入文件。这可能是一个真正的问题,因为时间戳通常不是唯一的。