2016-01-15 68 views
-1

我有一組文件,其中以下信息:計算意味着在分組行

ID  Score Other 
ABR  0.98  NBNMSB 
BCG  0.76  NBNMSB 
CVD  0.6  NBNMSB 
BCG  0.9  VSCVA 
CVD  0.56  VSCVA 
ABR  0.9  VSCVA 
CVD  0.7  BAVSC 
BCG  0.4  BAVSC 
ABR  0.5  BAVSC 
ABR  0.8  NBNMSB 
BCG  0.6  NBNMSB 
CVD  0.3  NBNMSB 
BCG  0.7  VSCVA 
CVD  0.0  VSCVA 
ABR  0.1  VSCVA 
CVD  0.5  BAVSC 
BCG  0.8  BAVSC 
ABR  1.0  BAVSC 

我想計算跨第一欄分數即ID最大爲每個第三列的這樣的結果將由第一列和得分的最大值被分組爲將第三列的計算如下:

文件ABR.txt

ABR  0.98 NBNMSB 
ABR  0.9  VSCVA 
ABR  1.0  BAVSC 

文件BCG.txt

BCG  0.76  NBNMSB 
BCG  0.9  VSCVA 
BCG  0.8  BAVSC 

和同爲CVD exceot這些文件是真的大,多個這樣的文件,目前我使用下面的代碼:

同時讀取ID;做

while read line; do 
    block=$(echo $line | awk '{print $1}') 
    max_of_score=$(grep $block Negative/fileofinterest*.ext | grep $ID | awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print max}') 
    echo $block $max_of_score >> $ID"_max.txt" 
done < fileOfcolumn3values.txt 
#contains all the possible values of column 3 (in this case NBNMSB, VSCVA, BAVSC) 
done < fileOfIdscolumn1.txt 
#contains all possible values of column 1 (in this case ABR, BCG, CVD) 

我想找到可能比上述算法更快運行的代碼,TIA

+2

你的問題還不清楚。你說你有一組包含一些信息的文件,其中包含一個例子。然後列出2個文件。這些示例輸入或預期的輸出文件?你發佈的第一組數據有什麼相關性?如果他們是輸入,輸出是什麼?這聽起來像你需要一些東西來處理多個文件,所以請發佈3個小樣本輸入文件以及給定這3個輸入文件的預期輸出。如果預期的輸出是多個文件,然後說明並顯示。 –

回答

1

您可以完全在awk

awk '{ 
    if (($1, $3) in a) 
    { 
     if ($2 > a[$1, $3]) a[$1, $3] = $2 
    } 
    else a[$1, $3] = $2 
    }; 
    END 
    { 
    for (x in a) 
    { 
    split(x, b, SUBSEP); print b[1], a[x], b[2] > b[1]".txt" 
    } 
    }' file 

這產生

cat ABR.txt 
ABR 1.0 BAVSC 
ABR 0.98 NBNMSB 
ABR 0.9 VSCVA 

+0

讓我試試這個,謝謝 – AishwaryaKulkarni