GNU/Linux >> Linux Esercitazione >  >> Linux

Comando Linux per concatenare un file a se stesso n volte

Due parti a questo, per me - prima - usare cat per inviare il file di testo allo standard output e usare append per aggiungerlo a un altro file - ad esempio foo.txt>>bar.txt aggiungerà foo.txt a bar.txt

quindi eseguilo n volte con

for i in {1..n};do cat foo.txt >> bar.txt; done

sostituendo n in quel comando con il tuo numero

dovrebbe funzionare, dove n è il tuo numero

Se usi csh, c'è il comando 'repeat'.

ripetere le parti correlate della risposta vengono copiate da qui e l'ho testato su un sistema Ubuntu 11.04 sulla shell bash predefinita.


Puoi certamente usare cat per questo:

$ cat /tmp/f
foo
$ cat /tmp/foo /tmp/f
foo
foo

Per ottenere $n copie, potresti usare yes convogliato in 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

Metterlo insieme dà

yes /tmp/f | head -n $n | xargs cat >/tmp/output

Sono annoiato, quindi ecco alcuni altri metodi su come concatenare un file a se stesso, principalmente con head come stampella. Perdonami se mi spiego troppo, mi piace dire cose :P

Supponendo N è il numero di autoconcatenazioni che vuoi fare e che il tuo file si chiami file .

Variabili:

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)

Data una copia di file chiamato file2 , total_repeats è il numero di volte file dovrebbe essere aggiunto a file2 per renderlo uguale a file è stato concatenato a se stesso N volte.

Detto MATH è qui, più o meno:MATH (essenza)

È roba di informatica del primo semestre, ma è passato un po' di tempo dall'ultima volta che ho fatto una dimostrazione di induzione, quindi non riesco a superarla... (anche questa classe di ricorsione è abbastanza nota per essere 2^Loops quindi c'è anche quello....)

POSIX

Uso alcune cose non posix ma non sono essenziali. Per i miei scopi:

 yes() { while true; do echo "$1"; done; }

Oh, ho usato solo quello. Vabbè, la sezione è già qui...

Metodi

head con monitoraggio del numero di righe.

ln=$linecount
for i in $(seq 1 $N); do
    <file head -n $ln >> file;
    ln=$((ln*2))
done

Nessun file temporaneo, nessun gatto, nemmeno troppa matematica ancora, tutta gioia.

tee con MATH

<file tee -a file | head -n $total_lines > $tmp
cat $tmp > file

Qui tee sta leggendo da file ma aggiungendovi continuamente, quindi continuerà a leggere il file ripetutamente fino a head lo ferma. E sappiamo quando fermarlo grazie a MATH . L'aggiunta va oltre, quindi ho usato un file temporaneo. Potresti tagliare le righe in eccesso da file anche.

eval , il signore delle tenebre!

eval "cat $(yes file | head -n $((total_repeats+1)) | tr '\n' ' ')" > $tmp
cat $tmp > file

Questo si espande solo a cat file file file ... e lo valuta. Puoi farlo senza $tmp anche file:

eval "cat $(yes file | head -n $total_repeats | tr '\n' ' ')" |
  head -n $((total_lines-linecount)) >> file

Il secondo head "trucchi" cat mettendo un intermediario tra esso e l'operazione di scrittura. Potresti ingannare cat con un altro cat pure ma che ha un comportamento incoerente. Prova questo:

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

Forza sed nel leggere l'intero file come una riga, lo cattura tutto, quindi lo incolla $total_repeats numero di volte.

Questo ovviamente fallirà se hai caratteri nulli nel tuo file. Scegline uno che sai non c'è.

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
}

Per ora è tutto ragazzi, spero che questa risposta arbitraria non abbia disturbato nessuno. Li ho testati tutti molte volte, ma sono solo un utente di shell da due anni, quindi tienilo a mente, immagino. Ora a dormire...

rm $tmp


Linux
  1. Esempi importanti di comandi Cat in Linux

  2. Comando wc Linux

  3. Comando gatto Linux

  4. 14 Utili esempi di comandi "cat" in Linux

  5. file Esempi di comandi in Linux

Comando Gzip in Linux

Comando Gunzip in Linux

Comando Stat in Linux

10 esempi di comandi Linux Cat per principianti

Utilizzo di Cat Command in Linux con esempi

Esempi di comandi di Linux cat