Me gustaría tener cada línea en un archivo repetido un número fijo de veces.
Por ejemplo, que cada línea se repita cuatro veces:
a
b
c
se convierte en:
a
a
a
a
b
b
b
b
c
c
c
c
He realizado algunas búsquedas, y hay muchas preguntas y respuestas en el sentido de hacer lo contrario, por ejemplo, fusionar líneas duplicadas en líneas individuales, y tal vez algunas sobre duplicar líneas imprimiéndolas nuevamente.
Sería fácil hacer esto en C, pero desearía saber más sobre los comandos nativos para no tener que recurrir a este tipo de descartes todo el tiempo.
text-processing
sed
awk
perl
Yimin Rong
fuente
fuente
awk
'sfor
no necesita apoyos si sólo hay un comando para repetir. Yperl
es más sencillo si se utilizaforeach
en bucle:for$i(0..3){print}
.perl -ne 'print(($_)x4)'
. Además, debe citar$line
(en eco) en su versión bash.BEGIN { ORS="\r\n" }
Me pregunto si esto se está convirtiendo en un partido de golf :
Explicación:
sed's
p
comando es imprimir la línea actual. El comportamiento predeterminado es imprimir la línea actual justo antes de pasar a la siguiente línea (es por eso que sed tiene-n
que permitirle desactivarla). Algunos seds más antiguos no tienen punto y coma (creo), por lo que es posible que tenga que hacersed -e p -e p -e p
Awk trabaja con
condition {action}
pares. Si se omite la acción, el valor predeterminado es imprimir la línea actual si la condición devuelve verdadero. Awk, como muchos lenguajes tipo C, se trata1
como verdadero. (Para completar, si se omite la condición, la acción se ejecutará para cada registro).Muchas funciones perl aprovechan la variable "predeterminada". Esta línea es equivalente a (en perl 5.16):
fuente
1
en awk? Taquigrafía paraprint $0
?1
(verdadera); El bloque predeterminado es equivalente a{print}
. Entonces, la declaración1
significaría imprimir el búfer de línea actual ({print}
). ({print}
y{print $0}
son casi lo mismo, qed.)sed
que no admite punto y coma como terminadores de comando; ¿Realmente hay tal cosa?fuente
Esto se puede hacer sin que se requiera
sed
,perl
oawk
.o usando un ciclo while:
Ejemplos
en bucle mientras buclefuente
Usando puramente shell:
fuente
--help
como una cadena en lugar de una opción? [considere el caso dondeline
está--help
u otra opción]yes -- --help
yes
yhead
significa que esto no es "puramente shell"Esto podría funcionar para usted (GNU sed):
Repetirá cada línea 4 veces.
O si lo prefieres:
Donde repites cada línea 3 veces más.
fuente
La respuesta de @potong no funciona con líneas vacías, reemplazar
\+
con*
debería solucionarlo:fuente