Newsgroup: it.comp.os.linux.sys
Titolo: concatenare 2 file in testa

Ciao a tutti.
Ho la necessità di prendere "fileX.txt" ed inserirne il suo contenuto
IN TESTA al file "fileORIG.txt".
Praticamente un "cat fileX.txt >> fileORIG.txt" ma al contrario, il
cat me lo butta in coda.
Come si può fare?

 Come si può fare?
Non si fa. Almeno, non con un comando solo.
cat fileX.txt fileORIG.txt > fileTEMP.txt && \
mv -f fileTEMP.txt fileORIG.txt
-- 
http://bofhskull.wordpress.com/



A meno di acrobazie che sconsiglio vivamente (soprattutto se i file sono
grandi), il modo migliore e' creare un file temporaneo e poi rinominarlo,
ad esempio
cat fileX.txt fileORIG.txt > tempfile.txt
mv tempfile.txt fileORIG.txt
Vedi anche 
http://wooledge.org:8000/BashFAQ/090

 writes:
    lotho> Ciao a tutti.
    lotho> Ho la necessità di prendere "fileX.txt" ed inserirne il suo contenuto
    lotho> IN TESTA al file "fileORIG.txt".
    lotho> Praticamente un "cat fileX.txt >> fileORIG.txt" ma al contrario, il
    lotho> cat me lo butta in coda.
    lotho> Come si può fare?
bash> tac fileORIG.txt fileX.txt | tac > tmp.txt && mv tmp.txt fileORIG.txt
ma hai comunque bisogno di un terzo file temporaneo.
--

 
# sed '1r fileX.txt' fileORIG.txt | sed 'w fileORIG.txt'

 mv -f fileTEMP.txt fileORIG.txt
Arriviamo al punto. Sono un pirla.
Dovevo concatenare i file di log, ovvero, ricostruire un unico mega
file a partire dalle varie rotazioni.
Soluzione: invertire la sequenza.... anzichè un ciclo basato su "seq 1
1 30" fare "seq 30 -1 1" e quindi " cat file.$i.log >> out.tmp; mv
out.tmp log.log"



Non l'hai provato, vero?


[...]
{ rm fileORIG.txt&&cat fileX.txt ->fileORIG.txt;}<fileORIG.txt
Dimitre



Questa e' una delle "pericolose acrobazie" di cui parlavo prima :) ...ma in
ogni caso, deve concatenarne 30 e ha gia' trovato un altro modo.

antani ha scritto:

Ops..di fretta, effettivamente..
ivpdrs60@omis431(/tmp)> cat - <<EOF >file1.txt
 > questo e' il primo file
 > per la prova con sed
 > EOF
ivpdrs60@omis431(/tmp)> cat file1.txt
questo e' il primo file
per la prova con sed
ivpdrs60@omis431(/tmp)> cat - <<EOF >file1.   ^[
ivpdrs60@omis431(/tmp)> cat - <<EOF >file2.txt
 > Questo e' il secondo file
 > sempre per il test con sedf
 > EOF
ivpdrs60@omis431(/tmp)> cat file3.txt
questo e' il primo file
Questo e' il secondo file
sempre per il test con sed
per la prova con sed
non é esattamente quello che mi aspettavo.. alloral 'unica, credo, é 
farlo con redirezioni da shell
ivpdrs60@omis431(/tmp)> cat file1.txt file2.txt >out.txt && mv out.txt 
file1.txt

 ogni caso, deve concatenarne 30 e ha gia' trovato un altro modo.
OK,
spero possa servire a qualcun altro :)
Dimitre

 potresti spiegare perché consideri pericoloso il codice sopra riportato?
Perche' se c'e' un problema nel bel mezzo del processo (tipo: disk full, o
crash del sistema - non cosi' improbabile se i file in gioco sono grandi),
e' praticamente certo che perdi tutto il file originale, mentre col file
temporaneo al massimo si perde il file temporaneo che si puo' sempre
ricreare (la mv filetemp.txt fileORIG.txt la fai solo se il precedente
passo, che e' dove i problemi possono capitare, e' andato a buon fine).
Ma visto che ormai ci siamo, altri metodi rischiatutto:
sed -i '1{h;r fileX.txt
D;}
2{x;G;}' fileORIG.txt
(almeno usare -i.bak)
o questo:
awk '{a[NR]=$0} 
END{
  close(ARGV[2])
  for(i=1;i<=NR;i++) print a[i]>ARGV[2]
}' fileX.txt fileORIG.txt

 crash del sistema - non cosi' improbabile se i file in gioco sono grandi),
[...]
Concordo pienamente.
Grazie
Dimitre

 Arriviamo al punto. Sono un pirla.
Per quello è buona regola sempre esporre anche il problema e non solo la 
soluzione pensata :) (ehi, mi ci metto pure io fra questi)
-- 
Vide