0

n個のファイルを含む配列INPUTFILESがあります

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  
}

早い方がファイルの最初の日付になり、配列内の小さい方のインデックスになります。

必要に応じてBASHで解決します。

更新 事前に日付の形式がわかりません。strftime(3c)形式になることはわかっています。

4

2 に答える 2

3
  1. 単純なループでは、各ファイルの最初の行を読み取り、この情報をハッシュに保存します。最初の行のデータにはハッシュキーがあり、ファイル名にはハッシュ値があります。

    my @inpufiles = ...;
    my %hash;
    foreach (@inputfiles) {
      open(my $fh, $_) or die $!;
      $hash{<$fh>} = $_;
      close $fh;
    }
    
  2. キーでハッシュを並べ替え、並べ替えられたハッシュのすべての値を出力します。

    foreach (sort (keys(%hash))) {
      print "$hash{$_}\n";
    }
    

    印刷したくない場合は、配列に保存してから、

    @inputfiles = map {$hash{$_}} sort (keys(%hash));
    

幸運を!


[アップデート]

質問の更新をフォローするには、次を使用して値をハッシュに保存することをお勧めします。

$hash{Time::Piece->strptime(<$fh>, $timeformat)->epoch} = $_;
于 2012-06-14T13:42:49.043 に答える
0

シュワルツ変換を使用して、ファイルのリストを並べ替えることができます。

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/;

これは実際には小さなbashパイプラインとして記述できるため、perlも必要ありません。

INPUTFILES=($(grep -m1 '' file_0 file_1 file_2 | sort -t: -k2 | cut -d: -f1))
于 2012-06-16T20:09:27.660 に答える