GNU/Linux >> Tutoriales Linux >  >> Linux

Comando de Linux para concatenar un archivo consigo mismo n veces

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


Linux
  1. Comando wc de linux

  2. Comando grep de Linux

  3. Comando gato de Linux

  4. 14 ejemplos útiles de comandos "cat" en Linux

  5. Ejemplos de comandos ln en Linux

Comando Gzip en Linux

Comando Gunzip en Linux

Comando Stat en Linux

10 ejemplos de comandos Cat de Linux para principiantes

Uso de Cat Command en Linux con ejemplos

Ejemplos de comandos cat de Linux