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