2016-01-15 3 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 

Я хочу, чтобы вычислить максимальные баллы через первую колонку, т.е. идентификатора для каждого из третьего столбца таким образом, чтобы результат был бы быть сгруппированы по первому столбцу и макс нот будет рассчитываться по третьей колонке следующим образом:

Файл 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

Смежные вопросы