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.
Con awk:
o con bash:
Salida:
fuente
Bueno, puedes hacerlo en sed, pero Python también funciona.
Los contenidos de la
reformatfile.py
son 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
pref
variables, 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