增量合并两个文件bash + mac

时间:2016-12-10 01:30:35

标签: bash macos merge

我想按行使用以下规则逐行合并两个文件:

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

3 个答案:

答案 0 :(得分:2)

John Zwinck's answer中所使用的

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: "Юлія"