Как мы можем суммировать группу значений из файла с помощью сценария оболочки

У меня есть файл, в котором у меня есть студенческий список №, имя, предмет, получение оценок и данные об общем количестве оценок:

10 William English 80 100
10 William Math 50 100
10 William IT 60 100
11 John English 90 100
11 John Math 75 100
11 John IT 85 100

Как я могу получить группу по сумме (общему количеству полученных оценок) каждого ученика в оболочке Shell? Я хочу этот вывод:

William 190
John 250

я пробовал это:

cat student.txt | awk '{sum += $14}END{print sum" "$1}' | sort | uniq -c | sort -nr | head -n 10

Это не рабочая группа ссылок по сумме.


person Kashif    schedule 13.09.2020    source источник


Ответы (2)


Одной командой awk:

awk '{a[$2]+=$4} END {for (i in a) print i,a[i]}' file

Выход

William 190
John 250

Если вы хотите отсортировать вывод, вы можете подключиться к sort, например. по убыванию по числовому второму полю:

awk '{a[$2]+=$4} END {for (i in a) print i,a[i]}' file | sort -rnk2

или по возрастанию по имени ученика:

awk '{a[$2]+=$4} END {for (i in a) print i,a[i]}' file | sort
person thanasisp    schedule 13.09.2020
comment
как мы можем сделать это без awk - person Kashif; 06.11.2020

Вам нужно использовать ассоциативный массив в awk.

Пытаться

awk '{ a[$2]=a[$2]+$4 } END {for (i in a) print i, a[i]}' 

a[$2]=a[$2]+$4 Создать ассоциированный массив с $2 в качестве индекса и суммой значений $4 в качестве значения

END ‹-- Обработать все записи

for (i in a) print i, a[i] ‹-- Вывести индекс и значение массива

Демо:

$awk '{ a[$2]=a[$2]+$4 } END {for (i in a) print i, a[i]}' temp.txt 
William 190
John 250
$cat temp.txt 
10 William English 80 100
10 William Math 50 100
10 William IT 60 100
11 John English 90 100
11 John Math 75 100
11 John IT 85 100
$

person Digvijay S    schedule 13.09.2020