
私は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=1
GNUでのみこれを要求します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