$ 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
Использование 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
свернуть значения второго поля в список, разделенный запятыми -Мы можем отсортировать, а затем передать 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