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.