Alguém sabe uma maneira simples de realizar um merge de dois arquivos .txt de modo que os originais não sejam alterados ?
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
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.
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.
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:
- Unir dois arquivos
cat "arquivo_a.txt" "arquivo_b.txt" > "arquivo_c.txt"
- Pegar apenas a diferença entre dois arquivos:
diff "arquivo_a.txt" "arquivo_b.txt" | grep ^">" | cut -c 3- > "arquivo_c.txt"
- Intercalar o “arquivo_a.txt” e o “arquivo_b.txt”:
paste -d '\n' "arquivo_a.txt" "arquivo_b.txt" > "arquivo_c.txt"
- 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
Não precisa explicar… basta traduzir dessa língua aí para o português.
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.