毎月の日付と時刻のスタンプを含む最新のファイルをインポートする必要があります。

毎月の日付と時刻のスタンプを含む最新のファイルをインポートする必要があります。

私はUnixプログラミングを始めましたが、要件があります。ランディングゾーンに4つのファイルがあり、その月と年の最新のファイルをインポートするにはスケジューラが必要です。

たとえば、

FILE_NR_WEEKLY_01_20130528_CHARGE

FILE_NR_WEEKLY_01_20130530_CHARGE--> This needs to be picked 1st for may month

FILE_NR_WEEKLY_01_20130601_CHARGE

FILE_NR_WEEKLY_01_20130604_CHARGE -->This needs to be picked up for June month

上記の年、月、日の組み合わせが与えられたら、最新のファイルをインポートする必要があります。

答え1

あなたが提供した抜粋は次のとおりです。

ls -r | POSIXLY_CORRECT=1 awk '
  match($0,"20[0-9]{6}") && !n[substr($0,RSTART,6)]++'

動作します。POSIXLY_CORRECT=1GNUでのみこれを要求しますawk。そうでなければ、他の実装を認識しません(他の実装に害を与えません{6})。awk

GNUsort保証安定タイプ、

ls -r | sort -ut_ -k 5,5.6

また可能です(5番目のフィールドの予想日)。

答え2

1〜2年のうち数ヶ月(例:2012年、2013年)にのみ興味があることを知っています。知る最新の月のファイルが前の月のファイルよりも最新です。つまり、1月のファイルが作成された場合今後2月のファイルなど)、ファイルのタイムスタンプを使用して、各年と月の最新のファイルを見つけることができます。ファイルを日付別にソートし(ls -tr)、最後のファイル(tail -n 1)を選択します。

for year in 2012 2013; do for month in {1..12}; do 
   file=`ls -tr *$year*$month??_* | tail -n 1` && 
   if [ -f "$file" ]; then echo "$year/$month $file";fi;
   done;done 2>/dev/null 

「最新」ファイルが最新のファイルであるかどうかわからない場合は、その名前を解析する必要があります。

find . -type f | perl -ne 'chomp; /_(\d{4})(\d{2})(\d{2})_/; 
    $newest{$1}{$2}=$_ if $3>$newest{$1}{$2}; 
    END{
       foreach $year (keys(%newest)){
         foreach $month (keys %{$newest{$year}}){
           print "$year/$month\t$newest{$year}{$month}\n"
        } } }' | sort

関連情報