2013-08-01 12 views
90

Voglio copiare il contenuto di cinque file in un file così com'è. Ho provato a farlo usando cp per ogni file. Ma questo sovrascrive i contenuti copiati dal file precedente. Ho anche provatoCome aggiungere il contenuto di più file in un file

paste -d "\n" 1.txt 0.txt 

e non ha funzionato.

Voglio che il mio script aggiunga la nuova riga alla fine di ogni file di testo.

es. File 1.txt, 2.txt, 3.txt. Metti il ​​contenuto di 1,2,3 in 0.txt

Come faccio?

+1

possibile duplicato del [file Concatenazione e inserire New Line In Between Files] (http://stackoverflow.com/questions/8183191/concatenating-files-and-insert-new-line-in-between-files) –

+0

Un'altra risposta qui: http://stackoverflow.com/questions/ 2576693/linux-merging-multiple-files-each-on-a-new-line –

risposta

183

è necessario il cat (abbreviazione di concatenate) di comando, con le coperture di reindirizzamento (>) nel vostro file di output

cat 1.txt 2.txt 3.txt > 0.txt 
+6

dovrebbe essere >> giusto? e anche perché c'è una nuova riga prima di tutto il testo nel mio file 0.txt? – Steam

+0

vuoi conservare il contenuto di 0.txt? – sehe

+7

@blasto dipende. Dovresti usare '>>' per _appendere_ un file su un altro, dove '>' _overwrites_ il file di output con qualunque cosa sia diretta in esso. Per quanto riguarda la nuova riga, c'è una nuova riga come primo carattere nel file '1.txt'? Puoi scoprirlo usando 'od -c' e vedere se il primo carattere è un' \ n'. – radical7

55

Un'altra opzione, per quelli di voi che ancora inciampare su questo post come ho fatto io, è utilizzare find -exec:

find . -type f -name '*.txt' -exec cat {} + >> output.file 

Nel mio caso, avevo bisogno di una più robusta opzione che apparirebbe attraverso molteplici sottodirectory così ho scelto di usare find. Abbattendolo:

find . 

Cerca all'interno della directory di lavoro corrente.

-type f 

Solo interessati a file, non le directory, ecc

-name '*.txt' 

Whittle giù il set di risultati per nome

-exec cat {} + 

Eseguire il comando cat per ogni risultato. "+" Significa solo 1 istanza di cat è generato (thx @gniourf_gniourf)

>> output.file 

Come spiegato in altre risposte, aggiungere il contenuto gatto ed per la fine di un file di output.

+4

Ci sono molti difetti in questa risposta. Innanzitutto, deve essere indicato il carattere jolly * * .txt' (altrimenti, l'intero comando 'find', come scritto, è inutile). Un altro difetto deriva da un malinteso grossolano: il comando che viene eseguito non è "cat >> 0.txt {}", ma "cat {}". Il tuo comando è in effetti equivalente a '{find. -tipo f -name * .txt -exec cat '{}' \; ; } >> 0.txt' (Ho aggiunto il raggruppamento in modo che tu capisca cosa sta realmente accadendo). Un altro difetto è che 'find' troverà il file' 0.txt', e 'cat' si lamenterà dicendo che _input file è output file_. –

+0

Grazie per le correzioni. Il mio caso era un po 'diverso e non avevo pensato ad alcuni di quei trucchi applicati a questo caso. – mopo922

+0

Dovresti mettere ">> output.file' alla fine del tuo comando, in modo da non indurre nessuno (incluso te stesso) a pensare che' find' eseguirà 'cat {} >> output.file' per ogni trovato il file. –

31

se si dispone di un certo tipo di uscita poi fare qualcosa di simile

cat /path/to/files/*.txt >> finalout.txt 
12

Se tutti i file sono nella directory singola si può semplicemente fare

cat * > 0.txt

Files 1.txt, 2 .txt, .. andrà in 0.txt

1

Se si desidera aggiungere il contenuto di 3 file in un file, il seguente comando sarà una buona scelta:

cat file1 file2 file3 | tee -a file4 > /dev/null 

Si combinerà il contenuto di tutti i file in file4, gettando output della console /dev/null.

8
for i in {1..3}; do cat "$i.txt" >> 0.txt; done 

Ho trovato questa pagina perché avevo bisogno di unire i file 952 in uno solo. Ho trovato che funziona molto meglio se hai molti file. Questo farà un ciclo per tutti i numeri che ti servono e cat ognuno usando >> per aggiungere alla fine di 0.txt.

+0

potresti usare l'espansione della parentesi graffa in bash per scrivere cat {1, 2,3} .txt >> 0.txt – mcheema

1

Se il file originale contiene caratteri non stampabili, verranno persi quando si utilizza il comando cat. Usando 'cat -v', i non stampabili verranno convertiti in stringhe di caratteri visibili, ma il file di output non conterrà ancora i caratteri reali non stampabili nel file originale. Con un numero limitato di file, un'alternativa potrebbe essere quella di aprire il primo file in un editor (ad es. Vim) che gestisce caratteri non stampabili. Quindi spostati nella parte inferiore del file e inserisci ": r second_file_name". Ciò inserirà il secondo file, inclusi i caratteri non stampabili. Lo stesso potrebbe essere fatto per i file aggiuntivi. Una volta letti tutti i file, inserisci ": w". Il risultato finale è che il primo file conterrà ora quello che ha fatto in origine, più il contenuto dei file che sono stati letti in

4

Un'altra opzione è sed:.

sed r 1.txt 2.txt 3.txt > merge.txt 

Oppure ...

sed h 1.txt 2.txt 3.txt > merge.txt 

Oppure ...

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here 

O senza il reindirizzamento ...

sed wmerge.txt 1.txt 2.txt 3.txt 

Nota che l'ultima linea di scrittura anche merge.txt (non wmerge.txt!). È possibile utilizzare w"merge.txt" per evitare confusione con il nome del file e -n per l'output non presidiato.

Naturalmente, è anche possibile abbreviare l'elenco dei file con i caratteri jolly. Per esempio, nel caso di file numerate come negli esempi precedenti, è possibile specificare l'intervallo con bretelle in questo modo:

sed -n w"merge.txt" {1..3}.txt 
1

se i file contengono intestazioni e si desidera rimuoverli nel file di output, è può usare:

for f in `ls *.txt`; do sed '2,$!d' $f >> 0.out; done 
2

Se tutti i file sono denominati in modo simile si può semplicemente fare:

cat *.log >> output.log 
Problemi correlati