Como mesclar todos os arquivos (texto) em um diretório em um?

75

Eu tenho 14 arquivos sendo todos partes de um texto. Eu gostaria de mesclá-los em um. Como fazer isso?

    
por Ivan 04.11.2010 / 22:15

6 respostas

145

Isso é tecnicamente o que o cat ("concatenate") deve fazer, mesmo que a maioria das pessoas apenas o use para a saída de arquivos para o stdout. Se você fornecer vários nomes de arquivos, eles serão exibidos sequencialmente, e você poderá redirecioná-los para um novo arquivo; no caso de todos os arquivos use apenas * (ou /path/to/directory/* se você não estiver no diretório já) e seu shell irá expandi-lo para todos os nomes de arquivos

$ cat * > merged-file
    
por 04.11.2010 / 22:21
23

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á estão ordenados e você deseja mesclá-los para analisá-los.

Mais portably:

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

Isso pode ou não preservar a ordem dos arquivos.

    
por 17.07.2013 / 17:03
10

O comando

$ cat * > merged-file

na verdade tem o efeito colateral indesejado de incluir 'arquivo mesclado' na concatenação, criando um arquivo de fuga. Para contornar isso, grave o arquivo mesclado em um diretório diferente;

$ cat * > ../merged-file

ou use uma correspondência de padrão que ignore o arquivo mesclado;

$ cat *.txt > merged-file
    
por 21.02.2012 / 13:24
7

Como os outros daqui dizem ... Você pode usar cat

Digamos que você tenha:

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

E você deseja apenas file01 a file03 e fileA a fileC :

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

Ou usando a expansão de contraventamento:

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

Ou, usando a expansão de suporte de palcos:

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

Ou você pode usar for loop:

for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
    
por 03.08.2016 / 12:09
0

Você pode especificar o pattern de um arquivo e mesclar todos eles da seguinte forma:

cat *pattern* >> mergedfile
    
por 03.08.2016 / 11:42
0

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

Note que a última linha escreve também 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.

Claro, você também pode encurtar a lista de arquivos com curingas. 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
    
por 31.05.2017 / 20:22