Предполагая, что ваши входные данные находятся в файле с именем `grades, попробуйте:
$ awk 'BEGIN{ PROCINFO["sorted_in"]="@ind_str_desc"} NR==1{next} {m[$1]; n[$2]; g[$2,$1]=$3} END{for (name in n) {printf "%s",name; for (month in m) printf " %s",g[name,month]; print""}}' grades | column -t
Steve 83 39
Sam 58 77
Mark 71 38
John 64 47
В выходных данных есть одна строка для каждого учащегося с оценками, представленными в порядке убывания месяца.
Для тех, кто предпочитает, чтобы их код был разбит на несколько строк:
gawk '
BEGIN{ PROCINFO["sorted_in"]="@ind_str_desc"}
NR==1{
next
}
{
m[$1]
n[$2]
g[$2,$1]=$3
}
END{
for (name in n) {
printf "%s",name
for (month in m)
printf " %s", g[name,month]
print""
}
}
' grades | column -t
НАЧАТЬ {PROCINFO ["sorted_in"] = "@ ind_str_desc"}
Это сообщает awk, что мы хотим, чтобы массивы были отсортированы в индексы. Это особенность GNU.
NR == 1 {next}
Это говорит awk пропустить первую строку. Если вы хотите добавить заголовок для выходного файла, мы можем сделать это здесь.
m [$ 1]
Указывает awk добавить запись для текущего месяца в ассоциативный массив m
. Нам не нужно присваивать значение, потому что мы просто будем использовать его, чтобы отслеживать, какие месяцы присутствуют во входных данных.
n [$ 2]
Указывает awk добавить запись для имени студента в ассоциативный массив n
. Нам не нужно присваивать значение, потому что мы просто будем использовать его, чтобы отслеживать, какие месяцы присутствуют во входных данных.
g [$ 2, $ 1] = $ 3
Присваивает оценку как значение под ключом имени учащегося, месяц в ассоциативном массиве g
.
END {для (имя в n) {printf "% s", имя; for (месяц в m) printf "% s", g [имя, месяц]; print ""}}
После того, как мы достигли конца файла, мы распечатываем все имена и оценки для каждого ученика.
column -t
Этот необязательный шаг делает вывод красивым.
Вы можете отключить это без изменения системных файлов, создав /etc/vimrc.local
и вставив следующее:
set mouse=
В документации Vim для параметра mouse
указано
The xterm handling of the mouse buttons can still be used by keeping the shift key pressed.
Многие предлагали :set mouse=a
, но я обнаружил, что только :set mouse=r
позволяет копировать и вставлять в Vim на Debian 9. Удачи!