Você poderia fazer isso com o sed, sim, mas outras ferramentas são mais simples. Por exemplo:
$ awk '{
printf "%s ", $2;
for(i=3;i<=NF;i++){
printf "%s:%s:1 ",$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
awk irá dividir cada linha de entrada no espaço em branco (por padrão), economizando cada campos como $1
, $2
, $N
. Então:
printf "%s ", $2;
imprimirá o segundo campo e um espaço à direita.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }
: iterará nos campos 3 até o último campo ( NF
é o número de campos) e, para cada um deles, imprimirá o 1º campo, a :
, o campo atual e a :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
As -a
marcas perl
se comportam como awk
e dividem sua entrada no espaço em branco. Aqui, os campos são armazenados na matriz @F
, o que significa que o 1º campo será $F[0]
, o 2º $F[1]
etc. Então:
print "$F[1] "
: imprime o segundo campo.
print "$F[0]:$_:1 " for @F[2..$#F];
: repita os campos 3 até o último campo ( $#F
é o número de elementos na matriz @F
, portanto, @F[2..$#F]
pega uma fatia da matriz que começa no terceiro elemento até o final da matriz) e imprime o 1º campo, a :
, depois o campo atual e um :1
.
print "\n"
: isso apenas imprime uma nova linha final.