Dos partes de esto, para mí, primero, usar cat para enviar el archivo de texto a la salida estándar y usar agregar para agregarlo a otro archivo, por ejemplo, foo.txt>>bar.txt agregará foo.txt a bar.txt
luego ejecútelo n veces con
for i in {1..n};do cat foo.txt >> bar.txt; done
reemplazando n en ese comando con tu número
debería funcionar, donde n es su número
Si usa csh, está el comando 'repetir'.
Las partes relacionadas repetidas de la respuesta se copian desde aquí, y lo probé en un sistema ubuntu 11.04 en el shell bash predeterminado.
Ciertamente puedes usar cat por esto:
$ cat /tmp/f
foo
$ cat /tmp/foo /tmp/f
foo
foo
Para obtener $n copias, puede usar yes conectado a head -n $n :
$ yes /tmp/f | head -n 10
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
Poner eso junto da
yes /tmp/f | head -n $n | xargs cat >/tmp/output
Estoy aburrido, así que aquí hay algunos métodos más sobre cómo concatenar un archivo consigo mismo, principalmente con head como muleta. Perdón si me explico demasiado, solo me gusta decir cosas :P
Asumiendo N es el número de autoconcatenaciones que desea hacer y que su archivo se llama file .
Variables:
linecount=$(<file wc -l)
total_repeats=$(echo "2^$N - 1" | bc) # obtained through the power of MATH
total_lines=$((linecount*(total_repeats+1)))
tmp=$(mktemp --suffix .concat.self)
Dada una copia de file llamado file2 , total_repeats es el número de veces file tendría que agregarse a file2 para que sea lo mismo que si file fue concatenado consigo mismo N veces.
Dijo MATEMÁTICAS está aquí, más o menos:MATEMÁTICAS (esencial)
Son cosas del primer semestre de informática, pero ha pasado un tiempo desde que hice una prueba de inducción, así que no puedo superarlo... (también esta clase de recursividad es bastante conocida por ser 2^Loops así que también está eso...)
POSIX
Uso algunas cosas que no son posix pero no son esenciales. Para mis propósitos:
yes() { while true; do echo "$1"; done; }
Oh, solo usé eso. Bueno, la sección ya está aquí...
Métodos
head con seguimiento de conteo de líneas.
ln=$linecount
for i in $(seq 1 $N); do
<file head -n $ln >> file;
ln=$((ln*2))
done
Sin archivo temporal, sin gato, ni siquiera demasiadas matemáticas todavía, todo alegría.
tee con MATEMÁTICAS
<file tee -a file | head -n $total_lines > $tmp
cat $tmp > file
Aquí tee está leyendo desde file pero agregándolo perpetuamente, por lo que seguirá leyendo el archivo repetidamente hasta head lo detiene Y sabemos cuándo detenerlo debido a MATEMÁTICAS . La adición se pasa de la raya, así que usé un archivo temporal. Podría recortar las líneas sobrantes de file también.
eval , el señor de las tinieblas!
eval "cat $(yes file | head -n $((total_repeats+1)) | tr '\n' ' ')" > $tmp
cat $tmp > file
Esto simplemente se expande a cat file file file ... y lo evalúa. Puedes hacerlo sin el $tmp archivo, también:
eval "cat $(yes file | head -n $total_repeats | tr '\n' ' ')" |
head -n $((total_lines-linecount)) >> file
El segundo head "trucos" cat poniendo un intermediario entre él y la operación de escritura. Podrías engañar a cat con otro cat también pero que tiene un comportamiento inconsistente. Prueba esto:
test_double_cat() {
local Expected=0
local Got=0
local R=0
local file="$(mktemp --suffix .double.cat)"
for i in $(seq 1 100); do
printf "" > $file
echo "1" >> $file
echo "2" >> $file
echo "3" >> $file
Expected=$((3*$(<file wc -l)))
cat $file $file | cat >> $file
Got=$(<file wc -l)
[ "$Expected" = "$Got" ] && R="$((R+1))"
done
echo "Got it right $R/100"
rm $file
}
sed :
<file tr '\n' '\0' |
sed -e "s/.*/$(yes '\0' | head -n $total_repeats | tr -d '\n')/g" |
tr '\0' '\n' >> file
Fuerzas sed para leer todo el archivo como una línea, lo captura todo y luego lo pega $total_repeats número de veces.
Por supuesto, esto fallará si tiene caracteres nulos en su archivo. Elige uno que sepas que no está allí.
find_missing_char() {
local file="${1:-/dev/stdin}"
firstbyte="$(<$file fold -w1 | od -An -tuC | sort -un | head -n 1)"
if [ ! "$firstbyte" = "0" ]; then
echo "\0"
else
printf "\\$(printf '%03o\t' $((firstbyte-1)) )"
fi
}
Eso es todo por ahora muchachos, espero que esta respuesta arbitraria no moleste a nadie. Los probé todos muchas veces, pero solo soy un usuario de shell de dos años, así que tenlo en cuenta, supongo. Ahora a dormir...
rm $tmp