2012-04-21 44 views
1

我在一個目錄中有文件;他們使用YYYY_MM_DD命名爲:將文件和管道組到awk命令

-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採取的是第一列的平均值。

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

使用相同的命令,我可以將兩個文件傳遞給awk以獲得兩個文件的總體平均值。

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

我想要做的是...

我想在我的目錄中的所有文件,以及它們分組每月,然後通過所有文件當月awk命令。

那麼按照同樣的數據,有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'的命令調用嗎?或者您是否需要掃描目錄中的所有文件,以查看哪些月份代表了所有文件? – 2012-04-21 20:43:33

回答

2

你想用awk獨自完成這項工作,還是可以使用文件匹配?例如:

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

將獲得所有的March文件。

你也可以使用2012_03*,但是它的通配模式比上述模式更具體。

編輯

您可以使用shell腳本是這樣的:

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可能存在。 – 2012-04-21 19:38:13

+0

看到我上面的編輯。 – 2012-04-21 19:51:45

+0

你們應該沒問題,我會有一段時間,讓我知道。謝謝。 – 2012-04-21 20:14:35

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 

編輯:錯誤:忘了目錄添加到路徑