Muitas vezes você pode ter vários ficheiros que precisam de ser fundidos num único ficheiro. Pode ser que anteriormente tenhas dividido um único ficheiro em múltiplos ficheiros, e queiras apenas integrá-los de volta ou que tenhas vários ficheiros de log que queiras integrar num único ficheiro. Seja qual for a razão, é muito fácil integrar vários ficheiros de texto num único ficheiro no Linux.
O comando no Linux para concatenar ou integrar vários ficheiros num único ficheiro chama-se cat. O comando cat por padrão irá concatenar e imprimir múltiplos arquivos para a saída padrão. Você pode redirecionar a saída padrão para um arquivo usando o operador ‘>’ para salvar a saída em disco ou sistema de arquivos.
Um outro utilitário útil para unir arquivos é chamado join que pode unir linhas de dois arquivos baseados em campos comuns. No entanto, ele pode funcionar apenas em dois arquivos de cada vez, e eu o achei bastante complicado de usar. Vamos cobrir principalmente o comando cat neste post.
Merge Multiple files into One in Order
O comando cat toma como argumento uma lista de nomes de ficheiros. A ordem em que os nomes dos ficheiros são especificados na linha de comando dita a ordem em que os ficheiros são fundidos ou combinados. Assim, se tiver vários ficheiros com o nome ficheiro1.txt, ficheiro2.txt, ficheiro3.txt etc….
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
O comando acima irá anexar o conteúdo do ficheiro2.txt ao fim do ficheiro1.txt. O conteúdo do ficheiro3.txt é anexado ao final do conteúdo fundido do ficheiro1.txt e ficheiro2.txt e assim por diante….e todo o ficheiro fundido é guardado com o nome mergedfile.txt no directório de trabalho actual.
Muitas vezes, poderá ter um número de ficheiros excessivamente grande o que torna mais difícil digitar todos os nomes dos ficheiros. O comando cat aceita expressões regulares como nomes de arquivos de entrada, o que significa que você pode usá-las para reduzir o número de argumentos.
bash$ cat file*.txt my*.txt > mergedfile.txt
Isso irá fundir todos os arquivos no diretório atual que começam com o nome do arquivo e tem uma extensão txt seguida pelos arquivos que começam com o meu e tem uma extensão txt. Você tem que ter cuidado ao usar expressões regulares, se você quiser preservar a ordem dos arquivos. Se a expressão regular estiver errada, irá afectar a ordem exacta em que os ficheiros são unidos.
Uma forma rápida e fácil de se certificar que os ficheiros são unidos na ordem exacta que quer, é usar a saída de outro programa de listagem de ficheiros como o ls ou encontrá-lo e canalizá-lo para o comando cat. Primeiro execute o comando find com a expressão regular e verifique a ordem dos ficheiros…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Isto irá imprimir os ficheiros de forma a que possa verificar se está correcto ou modificá-lo para corresponder ao que pretende. Você pode então pipear essa saída para o comando cat.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Quando você funde vários arquivos em um arquivo usando expressões regulares para combiná-los, especialmente quando ele é pipeado e onde o arquivo de saída não é muito óbvio, certifique-se de que a expressão regular não combina com o nome do arquivo fundido. No caso de corresponder, normalmente o comando cat é muito bom a dar erros com a mensagem “ficheiro de entrada é ficheiro de saída”. Mas ajuda a ter cuidado para começar com.
Merge Two Files at Arbitrary Location
Algumas vezes você pode querer fundir dois arquivos, mas em um determinado local dentro do conteúdo de um arquivo. Isto é mais como o processo de inserção de conteúdo de um arquivo em outro em uma posição particular no arquivo.
Se os tamanhos dos arquivos são pequenos e gerenciáveis, então o vi é uma ótima ferramenta de editor para fazer isso. Caso contrário, a opção é dividir primeiro o arquivo e depois fundir os arquivos resultantes em ordem. A maneira mais fácil é dividir o ficheiro é baseado nos números das linhas, exactamente onde quer inserir o outro ficheiro.
Você pode dividir o ficheiro em qualquer número de ficheiros de saída, dependendo da sua necessidade. O exemplo acima irá dividir o ficheiro1.txt em pedaços de 1234 linhas. É bem possível que você possa acabar com mais de dois arquivos, chamados xaa, xab, xac etc. Você pode mesclar tudo de volta usando o mesmo comando cat como mencionado anteriormente.
bash$ cat xaa file2.txt xa{b..z}
O comando acima irá mesclar os arquivos em ordem com o conteúdo do arquivo2.txt entre o conteúdo do xaa e do xab.
Um outro caso de uso é quando você precisa mesclar apenas partes específicas de certos arquivos, dependendo de alguma condição. Isto é especialmente útil para mim quando tenho de analisar vários grandes ficheiros de log, mas só estou interessado em certas mensagens ou linhas. Assim, eu precisarei extrair as mensagens de log importantes baseado em alguns critérios de vários arquivos de log e salvá-los em um arquivo diferente, mantendo ou preservando a ordem das mensagens.
Embora você possa fazer isso usando os comandos cat e grep, você pode fazer isso apenas com o comando grep também.
bash$ grep -h "" logfile*.log > onlyerrors.log
O acima irá extrair todas as linhas que combinam com o padrão e salvá-lo em outro arquivo. Você terá que ter certeza que os arquivos de log estão em ordem ao usar a expressão regular para combiná-los, como mencionado anteriormente no post.