Как объединить и суммировать поля на основе 2 столбцов

Теперь Ansible отвечает на этот вопрос, добавляя параметр umask к модулям, подобным упомянутым, которые создают файлы без определенного режима.

Я не вижу большого недостатка, если вы добавите этот более явный параметр там, где это необходимо. Может быть, просто небольшое раздражение при чтении роли.

Замечу, что модуль copy не реализует umask . Вы можете указать режим , просто у него немного другая семантика. Если бы вы могли указать umask , а файл уже существовал (независимо от содержимого), то его режим не был бы изменен. (В роли, над которой я работаю, думаю, полезно, что модуль копирования заставил меня задуматься об этом).

Замечу, что в исходном сообщении упоминаются разрешения на нарушение протокола для доступной установки в /usr/lib/python2.6/site-packages . Конечно, это также будет проблемой при запуске pip вручную. Это звучит как дефект в pip ... но в отличие от пакетов ОС, пакеты pip также могут быть установлены внутри virtualenv , поэтому для pip гораздо сложнее определить намерение пользователя .Возможно, это скорее пример потенциально непредвиденной проблемы из-за использования ограничительной маски umask.

2
20.01.2017, 14:53
2 ответа

Кэш данных GNU создан для такого рода задач - например,

datamash -WH -g 1,2 sum 3,4 count 4

или более подробно

datamash --whitespace --headers \
  groupby Bitrate,ASNUM sum TotalBytes,DownloadTime count DownloadTime

(не имеет значения, какой из несгруппированные поля, указанные вами для счетчика ).

Ваш случай немного усложняется пустыми строками, но вы можете просто вырезать их перед и снова добавить после, например,

sed '/^$/d' file | datamash -WH -g 1,2 sum 3,4 count 4 | column -t | sed G
GroupBy(Bitrate)  GroupBy(ASNUM)  sum(TotalBytes)  sum(DownloadTime)  count(DownloadTime)

280000            2856            122882           26                 2

1179968           2856            309430           11                 1

1179968           4156            309200           15                 1

4864960           2856            3111500          609                3
1
27.01.2020, 22:03

Вот решение с использованием awk:

awk -F " " '
    NR==1 {print; next} 
    NF {a[$1" "$2]+=$3; b[$1" "$2]+=$4; c[$1" "$2]++} 
    END {for(i in a)print i, a[i], b[i], c[i]}
' file

--> inputFile должен находиться в каталоге, в котором выполняется команда

--> -F " " считает разделителем один пробел

--> NR==1{print;next} печатает заголовки на вывод и пропускает его

--> массив a[$1""$2] считает группировку по значению 1-го столбца и 2-го столбца. То же самое для массивов b и c.

--> Оператор += суммирует нужный столбец на основе группировки по массиву

--> Оператор ++, используемый с массивом c, сохраняет подсчет по группировке по

--> Последний цикл "for" используется для печати результатов на вывод

2
27.01.2020, 22:03

Теги

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