У меня есть миллионы данных выглядят как:Группировки и подытожить - 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
Благодаря @Simon для вас ответ! Я выполнил введенный код, но у меня все еще есть тот же результат, который я получил ранее (набор 0)! Любая идея о том, в чем проблема? – Baodbao
Я предлагаю проверить используемый вами разделитель полей ('FS'). Первоначально вы использовали канал ('|'), но я изменил его на вкладку, угадав, что это был фактический разделитель полей, и я использовал тестовый файл, разделенный табуляцией. Если у вас есть пробелы между полями или пробелами, вам необходимо установить 'FS' соответствующим образом. Поскольку у вас нет пробелов в метках или содержимом поля, просто использование пробелов было бы уместным. Это значение по умолчанию, поэтому вам не придется устанавливать 'FS' вообще. – Simon