![查找文件中的差异并按键对文件进行排序](https://linux22.com/image/70998/%E6%9F%A5%E6%89%BE%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%B7%AE%E5%BC%82%E5%B9%B6%E6%8C%89%E9%94%AE%E5%AF%B9%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F.png)
所以我有两种语言文件,英语和法语。它们的格式如下:
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
.这样,我可以将文件发送给我的翻译人员,他们可以翻译它。
当我取回它时,我可以简单地运行 catfrench.changes >> french; sort -o Language_fr_FR.properties
来合并更改。
我还需要一种按键而不是整行对语言文件进行排序的方法。
我研究过diff
但不确定如何正确使用它。我已经使用 Linux 有一段时间了,但在花哨的脚本编写方面还不太了解:)
谢谢你的帮助!
答案1
以下内容采用两个文件 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
答案2
你可以使用:
grep -v -f <(sed -r 's/([^=]*).*$/\1/' fr.i18n.txt) en.i18n.txt
它从 en.i18n.txt 中过滤 fr.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 也正确地指出,在这种情况下,过滤器列表也可以通过使用elimiter '='轻松生成cut
st1
字段:f
d
grep -v -f <(cut -d= -f1 fr.i18n.txt) eng.i18n.txt