Você poderia fazer isso com sed, sim, mas outras ferramentas são mais simples. Por exemplo:
$ awk '{
printf "%s ", ;
for(i=3;i<=NF;i++){
printf "%s:%s:1 ",,$(i)
}
print ""
}' file
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1
Explicação
o awk dividirá cada linha de entrada no espaço em branco (por padrão), salvando cada campo como , , $N . Então:
-
printf "%s ", ;imprimirá o segundo campo e um espaço à direita. -
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",,$(i) }: irá iterar nos campos 3 para o último campo (NFé o número de campos) e para cada um deles será impresso o primeiro campo, um:, depois o campo atual e um:1. -
print "": isso apenas imprime uma nova linha final.
Ou Perl:
$ perl -ane 'print "$F[1] "; print "$F[0]:$_:1 " for @F[2..$#F]; print "\n"' file
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1
Explicação
O -a faz com que perl se comporte como awk e divida sua entrada no espaço em branco. Aqui, os campos são armazenados na matriz @F , significando que o primeiro campo será $F[0] , o segundo $F[1] etc. Então:
-
print "$F[1] ": imprime o 2º campo. -
print "$F[0]:$_:1 " for @F[2..$#F];: iterar nos campos 3 para o último campo ($#Fé o número de elementos na matriz@F, portanto@F[2..$#F]usa uma divisão de matriz começando no terceiro elemento até o final da matriz) e imprime o primeiro campo, um:, depois o campo atual e um:1. -
print "\n": isso apenas imprime uma nova linha final.