매월 날짜 및 시간 스탬프가 포함된 최신 파일을 가져와야 합니다.

매월 날짜 및 시간 스탬프가 포함된 최신 파일을 가져와야 합니다.

방금 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

GNU sort보증안정적인유형,

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

또한 가능합니다(다섯 번째 필드에 예상 날짜).

답변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

관련 정보