2012-03-02 72 views
-2

在Python中有更好/更簡單的方法嗎?Python中更好的方法

我有一個計算CPS(每秒調用)的bash腳本。它在小文件上運行良好,但在大文件上效果不佳。它基本上採用我們正在計算CPS的文件,並提取作爲INVITING時間的字段7,進行排序並僅獲取唯一值。這全部放在tmp.file中。然後,腳本捕獲原始文件併爲tmp.file中的每個值記下greps,對它們進行計數,然後將時間和計數輸出到最終文件。

#!/bin/bash 

cat $1 |cut -d "," -f 7 | sort |uniq > /tmp/uniq.time.txt; 
list="/tmp/uniq.time.txt"; 

while read time 
    do 
    VALUE1=`cat $1 |grep "$time" |wc -l`; 
    echo $VALUE1 >> /tmp/cps.tmp; 
done < $list; 

rm /tmp/cps.tmp; 
+1

爲什麼這個標籤的IP語音? – 2012-03-02 21:04:06

+0

@SvenMarnach:我認爲這種情況下的「通話」是VoIP通話記錄。 – ninjagecko 2012-03-02 21:08:03

+0

這並不是說你如何計算「每秒呼叫」。例如,我會將「每秒呼叫」解釋爲對所有呼叫進行計數並將其除以第一次和最後一次呼叫之間的時間。如果你試圖做某種移動平均數或什麼的,你必須這樣說。此外,你應該說爲什麼你需要獨特的一切;是不是那些電話,或者是否由於某種原因重複? – ninjagecko 2012-03-02 21:09:52

回答

3

我認爲你正在試圖做的是簡單的:

cat $1 |cut -d "," -f 7 | sort | uniq -c 

注意:如果你希望交換的字段的順序:

| awk -F " *" '{print $3, $2}' 
+0

不錯,這當然是去這裏的路!不知道'-c'選項。 – 2012-03-02 21:14:50

+0

謝謝! uniq -c選項非常棒。這比一行一行地工作好得多。 – stu003 2012-03-02 21:27:37

-1

讀取CSV文件:

http://docs.python.org/library/csv.html

Uniquifying:

set(nonUniqueItems) 
+0

非抽象是一個壞主意。它丟棄OP感興趣的頻率。 – 2012-03-02 21:09:00

+0

@SvenMarnach:或許,取決於它們實際上是重複的還是實際的呼叫。但是OP在做,所以如果我錯了,那他就是錯的。這個問題真的應該改進。 – ninjagecko 2012-03-02 21:11:21

+0

OP首先獨立,然後統計每次發生的頻率。這當然不是最佳的。 – 2012-03-02 21:14:16

1

這當然可以做更容易,更有效地在Python:

import sys 
from itertools import groupby 

with open(sys.argv[1]) as f: 
    times = [line.split(",")[6] for line in f] 
times.sort() 
for time, occurrences in groupby(times): 
    print time, len(list(occurrences)) 

您的方法存在的問題是,您必須爲每個獨特時間掃描整個文件。即使使用bash,你也可以更高效地編寫它,但我認爲在Python中這樣做更方便。