создать сводку размеров объектов в одном списке, разделенном запятыми

unalias -a

согласно справочной странице.

0
03.05.2021, 12:14
3 ответа
$ awk '{ object[$1]= (object[$1]==""?"":object[$1] ",") $2 }
  END  { for(obj in object) print obj, object[obj] }' infile
A 1,2,9
B 4,3
C 5
ABC 12,6

Немного более эффективное (использование памяти; имеет значение для огромного файла, который не может поместиться в память ), т.е. не буферизация файла частично в память, как это делает только команда awk выше, но только до изменения ключа объекта:

$ <infile sort -k1,1 -k2,2n |\
  awk 'pre!=$1 { if(obj) { print obj; obj="" } }
               { obj= (obj==""?$1 " ":obj ",") $2; pre=$1 }
  END{ if(obj) print obj }'
A 1,2,9
ABC 6,12
B 3,4
C 5
5
28.07.2021, 11:35

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

$ datamash -t ' ' -s -g 1 collapse 2 <file
A 1,2,9
ABC 12,6
B 4,3
C 5

Опции:

  • -t '_'использовать пробел в качестве разделителя полей
  • -sсортировать ввод перед группировкой
  • -g 1группа на первом поле
  • collapse 2свернуть значения второго поля в список, разделенный запятыми -
5
28.07.2021, 11:35

Мы можем отсортировать, а затем передать GNU sed, который сравнивает текущее первое поле с предыдущим, чтобы сгенерировать разделенное запятыми ИЛИ вывести до этой точки.

$ < file sort -s -k1,1 \
| sed -Ee '
  :a
    $!N
    s/^((\S+)\s.*)\n\2\s+(\S+)/\1,\3/
  ta
  P;D
' -
A 1,2,9
ABC 12,6
B 4,3
C 5
1
28.07.2021, 11:35

Теги

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