2012-04-21 6 views
1

私はディレクトリ内のファイルを持っています。グループファイルやパイプ

-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 

同じコマンドを使用すると、2つのファイルをawkに渡して、両方のファイルの全体の平均を得ることができます。

私がやりたいことはこれです
awk -F, '{ x += $1 } END { print x/NR }' File1 File2 

...

私は、ディレクトリ内のすべてのファイルを取得したい、と月額グループにそれらを、その後、awkコマンドに月のすべてのファイルを渡します。 4月のセットに対しても同様に続いて

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

だから、同じデータごとに、月に7つのファイルがありますが、私はすべての7つのファイルはこのように私のawkコマンドに渡すことがしたいと思います。

+0

がどのように処理されるべきか月間決定しようとしているパスにディレクトリを追加するのを忘れ? 'monthly_stats 2012-03 2012-04'のようなコマンド呼び出しでしょうか?それとも、数ヶ月はそれらをすべて処理するために表現されているかを確認するためにディレクトリ内のすべてのファイルをスキャンする必要があるでしょうか? –

答えて

2

あなたは何とか一人でのawkでこれを達成するために欠けている、またはあなたがグロブファイルを使用することができますか?例:

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

すべての3月のファイルを取得します。

また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

これはOKになりますが、私はちょうどディレクトリを指すようにしたいとあなたは私を理解している場合、それはバッチとして各月がいくつあるかヶ月うまくおよびプロセスがあります。ここにも複数の年が存在するので、2012_04_11と2011_04_11が存在する可能性があります。 –

+0

上記の編集を参照してください。 –

+0

yehはうまくいくはずです。私は時間があるときに遊びをして知らせます。ありがとう。 –

1

Perlでは、あなたはこのようにそれを行うことができます:

#!/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 

EDIT:バグ: