Risposte:
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 ci si trova già nella directory) e la shell lo espanderà in tutti i nomi dei file
$ cat * > merged-file
numeric_glob_sort
opzione).
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ù facilmente:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
Questo può o meno conservare l'ordine dei file.
"*.csv"
, in quanto il guscio sarebbe poi passare il letterale *
a find
.
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
cat * > merged-file
funziona bene. I globi vengono elaborati prima della creazione del file. Se merged-file
esiste già cat
(almeno il mio) rileverà che si tratta del file di output e rifiuterà di leggerlo. SE il file esiste già E hai il reindirizzamento più avanti nella pipeline, quindi ovviamente non può farlo, quindi solo e solo allora ottieni il file in fuga.
cat
non ha modo di rilevare se il file è quello di output. Il reindirizzamento avviene nella shell; cat
stampa solo su stdout.
Come gli altri da qui dicono ... Puoi usare cat
Diciamo che hai:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
E vuoi solo file01
a 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
[01-03]
non funzionerà come un modello globbing.
È possibile specificare il pattern
di un file, quindi unirli tutti come segue:
cat *pattern* >> mergedfile
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
*
in un ordine "naturale". Se hai "file1.txt ... file9.txt ... file14.txt" non funzionerà perché file1? .Txt ordinerà tra file1.txt e file2.txt. Dovresti rinominarli in "file01.txt ... file09.txt ... file14.txt". Di 'echo *
se non sei sicuro.