我想按行使用以下规则逐行合并两个文件:
file2 - 是最新的英文版本; file1 - 以前的翻译版本。
文件1
foo_11: "Марія"
foo_12: "Іванка"
foo_13: "Юлія"
file2的
foo_11: "Maria"
foo_112: "Superman"
FOOTLONG: "Subway"
foo_13: "Julia"
我想将它们合并到结果文件( file1 )中,看起来像这样
foo_11: "Марія"
foo_112: "Superman"
FOOTLONG: "Subway"
foo_13: "Юлія"
即。如果行的第一部分没有改变,则整行保持不变。如果第一部分已更改或不存在,则应添加整行或替换以前的版本。我想仅将 file1 添加到新行中,并且可以很好地标记已更改的行,例如 foo_12 。
换句话说,我需要git-merge,但由于文件只是部分相同,我不知道如何实现这一点。
我正在尝试在Mac bash中执行此操作。 感谢
UPD: del 。
答案 0 :(得分:2)
join
,如果输入已经排序或按需排序并且按排序顺序输出结果,则值得考虑一个选项。
awk
解决方案:
file2
的输入顺序,file2
独有的行,其尾随*
awk -F':' '
FNR==NR { seen[$1]=$0; next }
$1 in seen { print seen[$1]; next}
{ print $0 "*" }
' file1 file2 # > file1.tmp && mv file1.tmp file1
删除#
以使用输出实际更新file1
。
这将file1
行存储在一个关联数组中,其关键字首先是基于:
的第一个字段,然后按如下方式处理file2
:
file1
中找到第一个字段,请从file1
输出该行(现有翻译)。file2
输出该行并附加*
以表示该行是file2
的新行(需要翻译的新行)。答案 1 :(得分:1)
可以使用join
(需要输入已经分类)来完成繁重的工作:
join -a2 file1 file2
这会给你:
foo_11: "Марія" "Maria"
foo_112: "Superman"
FOOTLONG: "Subway"
foo_13: "Юлія" "Julia"
从那里删除第三列很简单:
join -a2 file1 file2 | cut -d'"' -f1-3
答案 2 :(得分:0)
在awk中:
$ awk 'NR==FNR { a[$1]=$2; next }
{ print $1, (a[$1]?a[$1]:$2) }
' file1 file2
foo_11: "Марія"
foo_112: "Superman"
FOOTLONG: "Subway"
foo_13: "Юлія"