it-swarm-pt.tech

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

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

99
Ivan

Tecnicamente, é isso que cat ("concatenate") deve fazer, mesmo que a maioria das pessoas apenas o use para gerar arquivos no stdout. Se você atribuir vários nomes de arquivos, todos eles serão exibidos seqüencialmente e, em seguida, você 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
182
Michael Mrozek

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.

27
3nrique0

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
10
Christopher Jones

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

Vamos dizer que você tem:

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

E você quer 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 for loop:

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

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

cat *pattern* >> mergedfile
0
user182845

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
0
Harini