Podría hacerlo con sed, sí, pero otras herramientas son más simples. Por ejemplo:
$ 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
Explicación
awk se dividirá cada línea de entrada en el espacio en blanco (por defecto), el ahorro de cada campos como $1
, $2
, $N
. Entonces:
printf "%s ", $2;
imprimirá el segundo campo y un espacio final.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }
: iterará sobre los campos 3 al último campo ( NF
es el número de campos) y para cada uno de ellos imprimirá el primer campo, a :
, luego el campo actual y a :1
.
print ""
: esto solo imprime una nueva línea final.
O 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
Explicación
Las -a
marcas se perl
comportan como awk
y dividen su entrada en espacios en blanco. Aquí, los campos se almacenan en la matriz @F
, lo que significa que el primer campo será $F[0]
el segundo, $F[1]
etc. Entonces:
print "$F[1] "
: imprime el segundo campo.
print "$F[0]:$_:1 " for @F[2..$#F];
: iterar sobre los campos 3 hasta el último campo ( $#F
es el número de elementos en la matriz @F
, por lo que @F[2..$#F]
toma un segmento de matriz que comienza en el tercer elemento hasta el final de la matriz) e imprime el primer campo, a :
, luego el campo actual y un :1
.
print "\n"
: esto solo imprime una nueva línea final.