Encontre diferenças no arquivo e arquivo de classificação por chave

3

Então eu tenho dois arquivos de idiomas, inglês e francês. Eles estão neste formato:

key=translation

Um exemplo em inglês seria:

ui.title=My Title

E em francês:

ui.title=Mon Titre

Então eu preciso de um script que leia os arquivos de idioma e encontre as diferenças. Então diga que o arquivo em inglês tinha chaves:

ui.title=Title
ui.close=Close

Mas o francês só tinha

ui.title=Mon Titre

Depois de executar o script, ele deve exibir um arquivo french.changes contendo ui.close=Close . Assim, posso enviar o arquivo para meus tradutores e eles podem traduzi-lo.

Quando eu recuperá-lo, posso simplesmente executar cat french.changes >> french; sort -o Language_fr_FR.properties para mesclar as alterações.

Eu também preciso de um método para classificar os arquivos de idioma pela chave e não pela linha inteira.

Eu olhei para diff , mas não sei como usá-lo corretamente. Eu tenho usado o Linux por um bom tempo, mas não tão rápido quanto a scripts sofisticados:)

Obrigado por qualquer ajuda!

    
por Chris Smith 15.08.2015 / 20:47

2 respostas

3

Você pode usar:

grep -v -f <(sed -r 's/([^=]*).*$//' fr.i18n.txt) en.i18n.txt

Que filtra todas as chaves de fr.i18n.txt de en.i18n.txt.

Exemplo:

$ cat > en.i18n.txt
ui.title=Title
ui.close=Close
ui.edit=Edit
ui.accept=Accept
^D
$ cat > fr.i18n.txt
ui.title=Titre
ui.edit=Modifier
^D
$ grep -v -f <(sed -r 's/([^=]*).*$//' fr.i18n.txt) en.i18n.txt
ui.close=Close
ui.accept=Accept
$ FINISHED="$(grep -v -f <(sed -r 's/([^=]*).*$//' fr.i18n.txt) en.i18n.txt)"
$ echo "$FINISHED"
ui.close=Close
ui.accept=Accept

@don_crissti também apontou corretamente que, nesse caso, a lista de filtros também pode ser gerada facilmente com cut tin a 1 st f ield usando d elimiter '=':

grep -v -f <(cut -d= -f1 fr.i18n.txt) eng.i18n.txt

    
por 15.08.2015 / 21:21
5

Seguem dois arquivos, eng e fr, os classificam na chave e "junta" -los na chave, mostrando apenas as entradas que faltam no arquivo 1 (eng).

join -t= -v1 <(sort -t= -k 1,1 eng) <(sort -t= -k 1,1 fr)

Portanto, o tipo da chave que você deseja é, por exemplo:

sort -t= -k 1,1 eng
    
por 15.08.2015 / 21:09