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 ( NFes 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 -amarcas se perlcomportan como awky 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 ( $#Fes 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.
Con awk:
o con bash:
Salida:
fuente
Bueno, puedes hacerlo en sed, pero Python también funciona.
Los contenidos de la
reformatfile.pyson así:¿Como funciona esto? Realmente no hay nada particularmente especial. Abrimos el primer argumento de la línea de comandos como archivo para leer y procedemos a dividir cada línea en "palabras" o elementos individuales. Las primeras palabras se vuelven
prefvariables, e imprimimos en el segundo elemento stdout (palabras [1]) que termina con espacio. A continuación, construimos un nuevo conjunto de "palabras" a través de la comprensión de la lista y la.join()función en una lista temporal de pref, cada palabra y cadena"1". El último paso es imprimirlosfuente
Con
awk:Se trata de formatear los campos separados por espacios en el formato deseado:
printf("%s ", $2)imprime el segundo campo con un espacio finalfor(i=3; i<NF; i++) printf("%s:%s:1 ", $1, $i)itera sobre los campos 3º al segundo e imprime los campos en el formato deseado (primer campo, luego dos puntos, luego el campo actual, luego dos puntos, finalmente 1) con un espacio finalprintf("%s:%s:1\n", $1, $NF)imprime el último campo con nueva líneaEjemplo:
fuente