Tengo una cadena como: dog cat bird whale
Y quiero conseguir dog dog cat cat bird bird whale whale
Todas las palabras están en la misma línea. ¿Alguna idea?
Agregando a la familia de soluciones :-).
duplicator.sh
:
for i; do echo -n "$i $i "; done; echo
Hacer ejecutable, y ahora:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
Alternativamente como una función de shell, por ejemplo, para ser reutilizable dentro de un script
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
que luego se puede ejecutar directamente donde se define como
duplicator dog cat bird whale
Podrías usar
sed
:Si desea guardar los cambios en el archivo en el lugar, diga:
También puedes usar
perl
:(Agregue la
-i
opción para guardar los cambios en el archivo en el lugar).O, como lo sugiere terdon :
Citando de
perlvar
:fuente
sed -r 's/\S+/& &/g'
.-a
:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
¿Qué sería esto sin una
awk/gawk
respuesta?Si una nueva línea de terminación es importante:
fuente
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;
es más corto y más legible, en mi humilde opinión.fuente
sed -n 'p;p'
, pensé que era más transparente sobre lo que estaba haciendo.Si tiene su cadena en una variable, por ejemplo
foo="dog cat bird whale"
, podría hacer:Golpe puro:
Explicación: Los paréntesis son necesarios para que
read
yecho
suceda en la misma subshell y, por lo tanto, puedan compartir variables. Sin ellos,echo
simplemente imprimirían una línea en blanco.coreutils:
Explicación: El
-o
indicador de lejoin
permite establecer el formato de salida. Aquí, le digo que imprima el primer campo del primer archivo (1.1
), seguido del segundo campo del primer archivo (1.2
), etc. De esta manera, cada campo del primer archivo se imprime dos veces. Sin embargo,join
está diseñado para, bueno, unir dos líneas de entrada en un campo común. Entonces, también le paso una línea en blanco (<(echo)
) y luego lo ignoro. Los-j
conjuntos se unen las de campo, estableciendo que a uno que no existe (la quinta) hace quejoin
imprimir toda la línea.Si no le importa el espacio en blanco o el orden de entrada, puede hacer
Perl 1:
Explicación:
La secuencia de comandos anterior guardará cada campo (de
@F
) dos veces en la matriz@k
y luego imprimirá@k
. Si no necesita la nueva línea final, puede simplificarPerl 2:
Explicación: La
-0
opción establece el separador de registro de entrada (como un número hexadecimal u octal, consulte aquí las conversiones). Aquí, lo estoy configurando en octal,040
que es un espacio. Las-p
marcasperl
imprimen cada "línea" de entrada y dado que hemos establecido el separador de registros en espacio, las líneas ahora están definidas por espacios, por lo que cada campo se imprime dos veces.awk
:Explicación:
NF
es el número de campos, por lo que el script anterior recorre cada campo y lo agrega a sí mismo. Una vez hecho esto, imprimimos la línea (1;
es solo una abreviatura para imprimir).fuente
Ahora por un
python
respuesta:Desde la línea de comando:
De stdin:
El resultado en ambos casos:
fuente
Ligeramente exagerado, pero una
haskell
respuesta:fuente
Otro enfoque, que también usa solo bash builtins
No veo ningún beneficio en comparación con la respuesta principal, solo para mostrar una forma ligeramente diferente, que podría ser más adecuada para algunos propósitos.
fuente
echo
También es un shell incorporado en Bash (pruebatype echo
).