Como realizar um merge entre dois arquivos .txt

Alguém sabe uma maneira simples de realizar um merge de dois arquivos .txt de modo que os originais não sejam alterados ?

1 Curtida

cara, não sei qual o sentido exato do que vc quer fazer com “merge”. Mas se seu merge é combinar dois arquivos em um outro novo, vc pode fazer do seguinte modo:

escreva o que quiser no a1.txt (estou usando o nano, mas vc pode usar qualquer outro editor de texto)

$ nano a1.txt

escreva o que quiser no a2.txt

$ nano a2.txt

crie um novo aquivo pra receber os dois

$ touch a3.txt

jogue o conteúdo de a1 em a3

$ cat a1.txt >> a3.txt

jogue o conteúdo de a2 em a3.txt

$ cat a2.txt >> a3.txt

Pronto, seja feliz.

caso tenha já escrito os dois arquivos, basta:

$ cat a1.txt >> a3.txt && cat a2.txt >> a3.txt

Obs: O símbolo $ é pra indicar que o que se segue a frente é um comando no terminal

Uai:

cat a1.txt a2.txt > a3.txt

2 Curtidas

Opa, obrigado pela ajuda galera mas o que gostaria de fazer é algo do tipo:
Comparar dois arquivos e, se uma linha “x” existe em a1 e não no a2 então somente essa linha “x” é inserida em a3.
Seria como escrever em a3 somente o que é diferente entre os dois arquivos (a1 - a2 = a3).

O comando diff pode ajudar a fazer isso (a limitação é que tipo, as linhas tem que estar na mesma ordem; se um a1 for “Pai; Filho; Espírito Santo” e a2 “Filho; Pai; Espírito Santo”, vão sair “Pai; Filho”, porque tecnicamente cada linha, par a par, é diferente).

Para garantir que tudo tá na mesma ordem, você pode fazer algo tipo: sort < a1 > a1-em-ordem para gerar uma versão com as linhas em ordem alfabética, ou preparar os arquivos assim desde o começo.

Esse comando toma a1 e a2 como entrada e joga um arquivo a3 como saída.

diff a1 a2 | sed -n -e 's#^< ##p' > a3

Explicação

diff a1 a2 é um programa que calcula as diferenças entre a1 e a2. A saída dele é no formato (ainda mantendo o exemplo acima):

< Pai
< Filho
----
> Filho
> Pai
> Deus 

Como você pode ver, as linhas “saem” (<) e “entram” (>). Nossa intenção é só as linhas que saem, daí vem a segunda metade do comando, que é vinculada à primeira pelo pipe |:

sed -n -e 's#^< ##p'

sed é um comando bem útil para editar texto, nesse caso o que fazemos é:

  • -n: só mandar de saída o que pedirmos
  • -e: comando a ser processador
  • 's#... substituir
  • ...^... no começo da linha
  • < esse caractere, seguido de um espaço
  • # por
  • nada.
  • #p e mandar a linha com essa alteração como saída.
2 Curtidas

Talvez vc consiga com a tecnologia git, que versiona arquivos, basicamente se vc criar dois branchs um com cada arquivo, depois vc pode fazer um Merge, o Merge vai tratar dos casos repetidos.
Você poderia tirar um tempo pra estudar git e talvez até Github…
Fora esses você também poderia tirar um tempo pra estudar ferramentas de pesquisa no terminal Linux, essa pesquisa pelas diferenças de dois arquivos é possível e também a escrita das diferenças. Mas a sintaxe fica um pouco complexa.

1 Curtida

Não ficou muito claro sobre o que você quer fazer… Presumo que você queria enviar esses arquivos do local para o remoto e assim compará-los de um commit para outro. É isso?

Existem alguns jeitos de responder sua pergunta que se enquadra na sua resposta:

  1. Unir dois arquivos
cat "arquivo_a.txt" "arquivo_b.txt" > "arquivo_c.txt"
  1. Pegar apenas a diferença entre dois arquivos:
diff "arquivo_a.txt" "arquivo_b.txt" | grep ^">" | cut -c 3- > "arquivo_c.txt"
  1. Intercalar o “arquivo_a.txt” e o “arquivo_b.txt”:
paste -d '\n' "arquivo_a.txt" "arquivo_b.txt" > "arquivo_c.txt"
  1. Intercalar apenas a diferença entre “arquivo_a.txt” e “arquivo_b.txt”:
diff "arquivo_a.txt" "arquivo_b.txt" | grep ^">" | cut -c 3- > "diferença.txt"
paste -d '\n' "arquivo_a.txt" "diferença.txt" | sed 's/\n//g' > "arquivo_c.txt"

Tem outros meios mais complexos mas acho que esses já resolvem, se quiser uma explicação detalhada eu explico

2 Curtidas

Não precisa explicar… basta traduzir dessa língua aí para o português. :rofl: :rofl: :rofl: :rofl:

Opa, na verdade esses meus arquivos são oriundos de uma recuperação feita com o Recuva.
Fiquei feliz pela recuperação, o software é realmente bom porém o arquivo original acabou se transformando em 6 outros e desta maneira não sei qual o mais “atualizado”.
Vou testar o comando diff e ver o que consigo fazer.