2012-04-21 2 views
1

디렉토리에 파일이 있습니다.awake 명령과 파일 그룹화

-rw-r--r-- 1 root root 497186 Apr 21 13:17 2012_03_25 
-rw-r--r-- 1 root root 490558 Apr 21 13:17 2012_03_26 
-rw-r--r-- 1 root root 488797 Apr 21 13:17 2012_03_27 
-rw-r--r-- 1 root root 316290 Apr 21 13:17 2012_03_28 
-rw-r--r-- 1 root root 490081 Apr 21 13:17 2012_03_29 
-rw-r--r-- 1 root root 486621 Apr 21 13:17 2012_03_30 
-rw-r--r-- 1 root root 490904 Apr 21 13:17 2012_03_31 
-rw-r--r-- 1 root root 491788 Apr 21 13:17 2012_04_01 
-rw-r--r-- 1 root root 488630 Apr 21 13:17 2012_04_02 

파일 내의 첫 번째 열은 숫자이며, 그 첫 번째 열의 평균을 적용하려면 다음 awk 명령을 사용하고 있습니다 : 그들은 YYYY_MM_DD를 사용하여 이름이 지정됩니다.

awk -F, '{ x += $1 } END { print x/NR }' MyFile 

동일한 명령을 사용하여 두 파일을 awk에 전달하여 두 파일의 전체 평균을 구할 수 있습니다.

awk -F, '{ x += $1 } END { print x/NR }' File1 File2 

내가하고 싶은 달이 ...

내 디렉토리에있는 모든 파일을 얻으려면

및 그룹들이 다음 awk 명령에 달 동안 모든 파일을 통과하다 .

그래서 동일한 데이터에 따라 3 월 7 파일, 나는 모든 7 개 파일이처럼 내 awk 명령에 전달하려는 것이있다 : 그리고 마찬가지로 에이프릴 세트에 대한

awk -F, '{ x += $1 } END { print x/NR }' File1 File2 File3 File4 File5 File6 File7 

.

+0

어떻게 처리해야하는 달 결정할 예정에 디렉토리를 추가하는 것을 잊었다? 'monthly_stats 2012-03 2012-04'과 같은 명령 호출일까요? 또는 디렉토리에서 모든 파일을 스캔하여 모두 처리하기 위해 몇 달이 표시되는지 확인해야합니까? –

답변

2

어쨌든 awk만으로이 작업을 수행하고 싶습니까, 아니면 파일 globbing을 사용할 수 있습니까? 예 :

awk -F, '{ #Do stuff }' 2012_03_[0-3][0-9] 

은 모든 March 파일을 가져옵니다.

2012_03*을 사용할 수도 있지만 위의 패턴보다 구체화 패턴에서 덜 구체적입니다.

편집

는이 같은 쉘 스크립트를 사용할 수

DIR="/tmp/tmp" 
for month in $(find "$DIR" -maxdepth 1 -type f | sed 's/.*\/\([0-9]\{4\}_[0-9]\{2\}\).*/\1/' | sort -u); do 
    awk -F, '#dostuff' "$DIR/${month}"_[0-3][0-9] > output/dir/SUM_"${month}" 
done 

은 언제나처럼, 몇 가지주의 사항이있다. 공백이있는 파일은 손상시킬 수 있습니다. 디렉토리에서 YYYY_MM_DD 형식을 따르지 않는 파일이있을 경우 오류가 발생하지만 성능에는 영향을 미치지 않습니다. 제약 조건이 받아 들여지지 않을 경우 알려 주시면 조금 더 생각해 보겠습니다.

+0

괜찮을 거에요.하지만 난 그냥 디렉토리를 가리키고 거기에 얼마나 많은 달이 있는지 알아 내고 매달 한 달에 한 번씩 처리해줬으면합니다. 여기에도 여러 해가 있으므로 2012_04_11 및 2011_04_11이 존재할 수 있습니다. –

+0

위의 수정 사항을 확인하십시오. –

+0

예치는 괜찮을 것입니다. 시간을 갖고 알리면 연극을 할거예요. 감사. –

1

펄이처럼 할 수있는 :

#!/usr/bin/env perl 
$dir = shift || "."; 
opendir(DIR, $dir); 
@files=grep (/\d{4}_\d{2}_\d{2}/, readdir(DIR)); 

foreach $file (@files) 
{ 
    ($year_month) = $file =~ /(\d{4}_\d{2})/; 
    open(FILE, "<$dir/$file"); 
    while($col = <FILE>) 
    { 
     $col =~ s/^(\d*)/\1/; 
     if($col) 
     { 
      $hash{"$year_month"}{"count"}++; 
      $hash{"$year_month"}{"sum"} += $col; 
     } 
    } 
} 

foreach $year_month (keys %hash) 
{ 
    $avg = $hash{"$year_month"}{"sum"}/$hash{"$year_month"}{"count"}; 
    print "$year_month : $avg\n"; 
} 

은 아마 짧은,하지만 당신이 원하는 경우에 당신이 좋은 해시 데이터 구조를 가지고 이런 식으로 다르게 나중에 계산하기 위해 할 수있는

.

script.pl /path/to/dir 

편집 : 같은 전화 버그 : 경로

관련 문제