it-swarm.it

Come unire tutti i file (di testo) in una directory in uno?

Ho 14 file che fanno tutti parte di un testo. Mi piacerebbe unirli in uno. Come farlo?

99
Ivan

Questo è tecnicamente ciò che cat ("concatenare") dovrebbe fare, anche se la maggior parte delle persone lo usa solo per inviare file a stdout. Se gli dai più nomi di file, li genererà tutti in sequenza, quindi puoi reindirizzarli in un nuovo file; nel caso di tutti i file basta usare * (o /path/to/directory/* se non sei già nella directory) e Shell lo espanderà a tutti i nomi dei file

$ cat * > merged-file
182
Michael Mrozek

Se i tuoi file non si trovano nella stessa directory, puoi utilizzare il comando find prima della concatenazione:

find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file

Molto utile quando i tuoi file sono già ordinati e vuoi unirli per analizzarli.


Più portabile:

find /path/to/directory/ -name *.csv -exec cat {} + > merged.file

Questo può o meno conservare l'ordine dei file.

27
3nrique0

Il comando

$ cat * > merged-file

in realtà ha l'effetto collaterale indesiderato di includere "file unito" nella concatenazione, creando un file run-away. Per ovviare a questo, scrivere il file unito in una directory diversa;

$ cat * > ../merged-file

oppure usa una corrispondenza di pattern che ignorerà il file unito;

$ cat *.txt > merged-file
10

Come gli altri da qui dicono ... Puoi usare cat

Diciamo che hai:

~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD

E vuoi solo file01 per file03 e fileA a fileC:

cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file

Oppure, usando l'espansione del controvento:

cat ~/file0{1..3} ~/file{A..C} > merged-file

Oppure, usando l'espansione del supporto più elaborato:

cat ~/file{0{1..3},{A..C}} > merged-file

Oppure puoi usare for loop:

for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
10
Florin Idita

È possibile specificare pattern di un file, quindi unirli tutti come segue:

cat *pattern* >> mergedfile
0
user182845

Un'altra opzione è sed:

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

O...

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

O...

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

O senza reindirizzamento ...

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

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

Naturalmente, puoi anche abbreviare l'elenco dei file con i caratteri jolly. Ad esempio, nel caso di file numerati come negli esempi precedenti, è possibile specificare l'intervallo con parentesi graffe in questo modo:

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