Найти отличия в файле и сортировке файла по ключу

Поэтому у меня есть два языковых файла: английский и французский. Они находятся в таком формате:

key=translation 

Например, на английском языке:

 ui.title=My Title 

И по-французски:

 ui.title=Mon Titre 

Поэтому мне нужен скрипт, который читает языковые файлы и находит различия. Так скажите, что у английского файла были ключи:

 ui.title=Title ui.close=Close 

Но на французском языке

 ui.title=Mon Titre 

После запуска скрипта он должен вывести файл french.changes содержащий ui.close=Close . Таким образом, я могу отправить файл моим переводчикам, и они могут его перевести.

Когда я french.changes >> french; sort -o Language_fr_FR.properties его, я могу просто запустить cat french.changes >> french; sort -o Language_fr_FR.properties french.changes >> french; sort -o Language_fr_FR.properties , чтобы объединить изменения.

Мне также нужен метод сортировки языковых файлов ключом не всей строки.

Я просмотрел diff но не уверен, как правильно его использовать. Я использую Linux довольно долгое время, но не настолько, чтобы ускорять причудливые скрипты 🙂

Спасибо за любую помощь!

Вы можете использовать:

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

Который фильтрует все ключи из файла fr.i18n.txt из en.i18n.txt.

Пример:

 $ 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/([^=]*).*$/\1/' fr.i18n.txt) en.i18n.txt ui.close=Close ui.accept=Accept $ FINISHED="$(grep -v -f <(sed -r 's/([^=]*).*$/\1/' fr.i18n.txt) en.i18n.txt)" $ echo "$FINISHED" ui.close=Close ui.accept=Accept 

@don_crissti также правильно указал, что в этом случае список фильтров также может быть легко сгенерирован с cut оловом в 1 м столбце, используя d exciter '=':

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

Следующее занимает два файла: eng и fr, сортирует их по ключу и «присоединяет» их к ключу, показывая только отсутствующие записи из файла 1 (eng).

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

Итак, сортировка по ключу, которую вы хотите, например:

 sort -t= -k 1,1 eng