2015-04-20 1 views
0

У меня есть миллионы данных выглядят как:Группировки и подытожить - AWK SCRIPT

TOTALOCTETSUNIT SERVEDACCOUNT SERVICECLASSID ACCUMULATEDUNITS ACCOUNTUNITSDEDUCTED ACCOUNTVALUEBEFORE ACCOUNTVALUEAFTER 
850    66498336   70    10240    10240     0.083333   0.083333 
259    64625247   41    10240    10240     65.500000   65.50000 
219792   76608974   35    225280    225280     653.049798   653.049798 
15261   76900654   35    20480    20480     35.516666   35.516666 

Я должен группе SERVEDACCOUNT затем SERVICECLASSID, а затем на основе результата этой группы я должен подвести итоги TOTALOCTETSUNIT , ACCUMULATEDUNITS, ACCOUNTUNITSDEDUCTED и ACCOUNTVALUEBEFORE Это не будет проблемой, если сумма на которой базируется только в одном поле, но мы должны группировать с помощью 2 поля

здесь является AWK скрипт я использую сохранить как тест. awk

BEGIN { FS = "|" } NR > 2500 {exit}    
1 < NR && NR <= 2500 { 
#sub(/ .*/,"",$4)  
key=$3 
TOTOCTET[key]+=$1 
ACCUNITS[key]+=$4 
ACCUNITTED[key]+=$5 
ACCVALBEF[key]+=$6} END { 
printf "%-13s %18s %18s %18s %18s\n", 
    "SERVEDACCOUNT","TOTALOCTETSUNIT","ACCUMULATEDUNITS","ACCOUNTUNITSDEDUCTED","ACCOUNTVALUEBEFORE" 
for (i in TOTOCTET) { 
    printf "%-4s %16.6f %16.6f %16.6f %16.6f\n", 
     i,TOTOCTET[i],ACCUNITS[i],ACCUNITTED[i],ACCVALBEF[i] } 
} 

запустить скрипт я использую $ AWK -f тест file.txt

Выход я получил это набор 0, как:

enterSERVEDACCOUNT TOTALOCTETSUNIT ACCUMULATEDUNITS ACCOUNTUNITSDEDUCTED ACCOUNTVALUEBEFORE 
0.000000    0.000000   0.000000   0.000000   0.000000 
0.000000    0.000000   0.000000   0.000000   0.000000 
0.000000    279.000000   0.000000   0.000000   0.000000 

Вот вывод я ищу:

SERVEDACCOUNT SERVICECLASSID TOTALOCTETSUNIT ACCUMULATEDUNITS ACCOUNTUNITSDEDUCTED ACCOUNTVALUEBEFORE 
64625247   41    259   10240     10240     65,5 
66498336   70    850   10240     10240     0,083333 
76608974   35    219792  225280    225280     653,049798 
76900654   35    15261   20480     20480     35,516666 

ответ

0

на данный момент ключ был установлен в $3, но если ключ должен быть определен SERVEDACCOUNT и SERVICECLASSID, то ключ должен быть на основе как $2 и $3, например .:

BEGIN { FS = "\t" } 
1 < NR && NR <= 2500 { 
    key=$2 "-" $3 
    TOTOCTET[key]+=$1 
    ACCUNITS[key]+=$4 
    ACCUNITTED[key]+=$5 
    ACCVALBEF[key]+=$6} END { 
    printf "%-13s %18s %18s %18s %18s %18s\n", 
    "SERVEDACCOUNT","SERVICECLASSID","TOTALOCTETSUNIT", 
    "ACCUMULATEDUNITS","ACCOUNTUNITSDEDUCTED","ACCOUNTVALUEBEFORE" 
    for (i in TOTOCTET) { 
     split(i,ii,/-/) 
     printf "%-16s %-16s %16.0f %16.0f %16.0f %16.0f\n", 
     ii[1],ii[2],TOTOCTET[i],ACCUNITS[i],ACCUNITTED[i],ACCVALBEF[i] 
     } 
    } 

... который выводит:

SERVEDACCOUNT  SERVICECLASSID TOTALOCTETSUNIT ACCUMULATEDUNITS ACCOUNTUNITSDEDUCTED ACCOUNTVALUEBEFORE 
76900654   35       15261   20480   20480    36 
66498336   70       850   10240   10240    0 
64625247   41       259   10240   10240    66 
76608974   35       219792   225280   225280    653 
+0

Благодаря @Simon для вас ответ! Я выполнил введенный код, но у меня все еще есть тот же результат, который я получил ранее (набор 0)! Любая идея о том, в чем проблема? – Baodbao

+0

Я предлагаю проверить используемый вами разделитель полей ('FS'). Первоначально вы использовали канал ('|'), но я изменил его на вкладку, угадав, что это был фактический разделитель полей, и я использовал тестовый файл, разделенный табуляцией. Если у вас есть пробелы между полями или пробелами, вам необходимо установить 'FS' соответствующим образом. Поскольку у вас нет пробелов в метках или содержимом поля, просто использование пробелов было бы уместным. Это значение по умолчанию, поэтому вам не придется устанавливать 'FS' вообще. – Simon

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

  • Нет связанных вопросов^_^