Bash

查找文件中的差異並按鍵排序文件

  • August 15, 2015

所以我有兩種語言文件,英語和法語。它們採用以下格式:

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 已經有一段時間了,但在編寫花哨的腳本時速度並不快 :)

謝謝你的幫助!

你可以使用:

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

cut@don_crissti還正確地指出,在這種情況下,過濾器列表也可以很容易地通過使用分隔符 ‘=’ 生成st欄位1f``d

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

下面獲取兩個文件,eng 和 fr,在 key 上對它們進行排序,然後在 key 上“join”它們,只顯示文件 1 (eng) 中的任何缺失條目。

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

所以你想要的鍵排序是例如:

sort -t= -k 1,1 eng

引用自:https://unix.stackexchange.com/questions/223420