Как сгруппировать по стране во втором столбце, а затем отсортировать по полученной сумме?

На B создайте обратный туннель от A :59103. Конечная точка относительно B — C :9103.

ssh -R 59103:C:9103 A

Измените номер порта на A с его 59103 на что-то подходящее.

Это решение принимает ваше утверждение о том, что B может достичь C за чистую монету. Соединение от B к C не защищено с помощью ssh.

0
28.04.2021, 16:04
2 ответа

СGNU awk:

$ awk 'BEGIN{PROCINFO["sorted_in"] = "@val_num_desc"}
       {a[$2]+=$1} END{for(k in a) print a[k], k}' ip.txt
8 UA
6 US
2 GB

См. руководство gawk :Использование предопределенных порядков сканирования массивов для получения подробной информации об опциях сортировки.


Сperl:

perl -lane '$h{$F[1]}+=$F[0]; END{print "$h{$_} $_" for
            sort {$h{$b} <=> $h{$a}} keys %h}' ip.txt
2
28.04.2021, 22:50

Использование GNUdatamash:

$ datamash -W -s -g 2 sum 1 <file
GB      2
UA      8
US      6

Это обрабатывает пробелы как разделители полей, сортирует ввод по второму полю, группирует его по этому полю и суммирует первое поле для каждой группы.

Направьте вывод через awk '{ print $2, $1 }', если вы хотите поменять местами столбцы(datamashвсегда записывает столбец группировки первым в своем выводе )и sort -nr, если вы хотите отсортировать этот вывод в порядке убывания, как в вашем пример:

$ datamash -W -s -g 2 sum 1 <file | awk '{ print $2, $1 }' | sort -nr
8 UA
6 US
2 GB

Использование awkдля суммирования:

$ awk '{ sum[$2] += $1 } END { for (i in sum) print sum[i], i }' file
8 UA
2 GB
6 US

Пропустите это через sort -nrдля сортировки, как описано выше.

0
28.04.2021, 22:50

Теги

Похожие вопросы