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