извиняюсь за однострочник, но вот оно -
awk 'BEGIN{FS="\t"} {for(i=2; i<=NF; i++) { if (!a[$1]) a[$1]=$1FS$i ;else a[$1]=a[$1]";"$i};if ($1 != old) b[j++] = a[old];old=$1 } END{for (i=0; i<j; i++) print b[i] }' 1
123 fvv ;kjf;ccd
567 abc;abc
879 ttt
sed 's/linux-[^ ]* //g'
[^ ]*
соответствует всем последующим символам, которые не являются пробелами, а *
после этого означает один или несколько
printf '%s' "$list" | tr ' ' '\n' | grep -v '^linux-' | paste -sd " "