Respostas:
Tecnicamente, é isso que cat
("concatenar") deve fazer, mesmo que a maioria das pessoas o use para gerar arquivos no stdout. Se você fornecer vários nomes de arquivos, todos eles serão exibidos sequencialmente e poderá redirecioná-los para um novo arquivo; no caso de todos os arquivos, basta usar *
(ou /path/to/directory/*
se você ainda não estiver no diretório) e seu shell o expandirá para todos os nomes de arquivo
$ cat * > merged-file
numeric_glob_sort
opção).
Se seus arquivos não estiverem no mesmo diretório, você poderá usar o comando find antes da concatenação:
find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
Muito útil quando seus arquivos já foram solicitados e você deseja mesclá-los para analisá-los.
Mais portatilmente:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
Isso pode ou não preservar a ordem dos arquivos.
"*.csv"
, pois o shell passaria o literal *
para find
.
O comando
$ cat * > merged-file
na verdade, tem o efeito colateral indesejado de incluir 'arquivo mesclado' na concatenação, criando um arquivo em fuga. Para contornar isso, escreva o arquivo mesclado em um diretório diferente;
$ cat * > ../merged-file
ou use uma correspondência de padrão que ignorará o arquivo mesclado;
$ cat *.txt > merged-file
cat * > merged-file
funciona bem. Os globos são processados antes da criação do arquivo. Se merged-file
já existir, cat
(pelo menos o meu) detectará que é o arquivo de saída e se recusará a lê-lo. Se o arquivo já existir E você tiver o redirecionamento posteriormente no pipeline, obviamente ele não poderá fazer isso; então, e somente então, você obterá o arquivo descontrolado.
cat
não tem como detectar se o arquivo é o de saída. O redirecionamento acontece no shell; cat
somente imprime em stdout.
Como os outros daqui dizem ... Você pode usar cat
Vamos dizer que você tem:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
E você deseja apenas file01
para file03
e fileA
para fileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
Ou, usando expansão de chave:
cat ~/file0{1..3} ~/file{A..C} > merged-file
Ou, usando a expansão de braçadeira mais sofisticada:
cat ~/file{0{1..3},{A..C}} > merged-file
Ou você pode usar o for
loop:
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
não funcionará como um padrão brilhante.
Você pode especificar o pattern
arquivo e mesclar todos eles da seguinte maneira:
cat *pattern* >> mergedfile
Outra opção é sed:
sed r 1.txt 2.txt 3.txt > merge.txt
Ou...
sed h 1.txt 2.txt 3.txt > merge.txt
Ou...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
Ou sem redirecionamento ...
sed wmerge.txt 1.txt 2.txt 3.txt
Observe que a última linha também grava merge.txt (não wmerge.txt!). Você pode usar w "merge.txt" para evitar confusão com o nome do arquivo e -n para saída silenciosa.
Obviamente, você também pode reduzir a lista de arquivos com caracteres curinga. Por exemplo, no caso de arquivos numerados, como nos exemplos acima, você pode especificar o intervalo com chaves desta maneira:
sed -n w"merge.txt" {1..3}.txt
*
na ordem "natural". Se você tiver "arquivo1.txt ... arquivo9.txt ... arquivo14.txt", ele não funcionará porque arquivo1? .Txt será classificado entre arquivo1.txt e arquivo2.txt. Você teria que renomeá-los para "file01.txt ... file09.txt ... file14.txt". Digaecho *
se você não tem certeza.