Respuestas:
Esto es técnicamente lo que cat
se supone que debe hacer ("concatenate"), a pesar de que la mayoría de las personas simplemente lo usan para generar archivos en stdout. Si le da varios nombres de archivo, los generará todos secuencialmente y luego podrá redirigirlos a un nuevo archivo; en el caso de todos los archivos, simplemente use *
(o /path/to/directory/*
si aún no está en el directorio) y su shell lo expandirá a todos los nombres de archivo
$ cat * > merged-file
numeric_glob_sort
opción).
Si sus archivos no están en el mismo directorio, puede usar el comando find antes de la concatenación:
find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
Muy útil cuando sus archivos ya están ordenados y desea fusionarlos para analizarlos.
Más portátil:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
Esto puede o no preservar el orden de los archivos.
"*.csv"
, ya que el shell pasaría el literal *
a find
.
El comando
$ cat * > merged-file
en realidad tiene el efecto secundario no deseado de incluir 'archivo combinado' en la concatenación, creando un archivo fuera de control. Para evitar esto, escriba el archivo combinado en un directorio diferente;
$ cat * > ../merged-file
o use una coincidencia de patrón que ignorará el archivo combinado;
$ cat *.txt > merged-file
cat * > merged-file
funciona bien. Los globos se procesan antes de crear el archivo. Si merged-file
ya existe, cat
(al menos el mío) detectará que es el archivo de salida y se negará a leerlo. SI el archivo ya existe Y tiene la redirección más adelante en la tubería, entonces obviamente no puede hacer eso, así que solo entonces obtendrá el archivo fuera de control.
cat
no tiene forma de detectar si el archivo es el de salida. La redirección ocurre en el shell; cat
solo imprime en stdout.
Como dicen los otros de aquí ... Puedes usar cat
Digamos que tienes:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
Y desea que sólo file01
a file03
y fileA
a fileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
O, usando la expansión de llaves:
cat ~/file0{1..3} ~/file{A..C} > merged-file
O, utilizando una expansión de llave más elegante:
cat ~/file{0{1..3},{A..C}} > merged-file
O puedes usar for
loop:
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
no funcionará como un patrón global.
Puede especificar el pattern
de un archivo y luego combinarlos todos de la siguiente manera:
cat *pattern* >> mergedfile
Otra opción es 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 sin redireccionamiento ...
sed wmerge.txt 1.txt 2.txt 3.txt
Tenga en cuenta que la última línea de escritura también merge.txt (no wmerge.txt!). Puede usar w "merge.txt" para evitar confusiones con el nombre del archivo y -n para la salida silenciosa.
Por supuesto, también puede acortar la lista de archivos con comodines. Por ejemplo, en el caso de archivos numerados como en los ejemplos anteriores, puede especificar el rango con llaves de esta manera:
sed -n w"merge.txt" {1..3}.txt
*
en orden "natural". Si tiene "file1.txt ... file9.txt ... file14.txt" no funcionará porque file1? .Txt se ordenará entre file1.txt y file2.txt. Debería cambiarles el nombre a "file01.txt ... file09.txt ... file14.txt". Diecho *
si no estás seguro.