合并两个几乎相似的文本文件

时间:2016-01-30 15:45:50

标签: shell unix merge

假设我们有~/file1

line1
line2
line3

...和~/file2

line1
lineNEW
line3

请注意,除line2lineNEW不同外,两个文件几乎完全相同。

问题:如何合并这两个文件以生成如下所示的文件:

line1
line2
lineNEW
line3

也就是说,如何合并这两个文件,以便将所有唯一行捕获(不重叠)到第三个文件中?请注意,行的顺序并不重要(只要捕获所有唯一行)。

3 个答案:

答案 0 :(得分:1)

awk '{
    print
    getline line < second
    if ($0 != line) print line
}' second=file2 file1

会这样做

答案 1 :(得分:1)

考虑下面的命令。它更加健壮,因为它也适用于添加了新行而不是替换的文件(参见下面的f1和f2)。

首先,我使用你的文件执行它。我将命令分成两行,以便它很好地适应“代码块”:

$ (awk '{ print NR, $0 }' file1; awk '{ print NR, $0 }' file2) |\
sort -k 2 | uniq -f 1 | sort | cut -d " " -f 2-

它产生您的预期输出:

line1
line2
lineNEW
line3

我还使用了这两个额外的文件来测试它:

F1:

line1   stuff after a tab
line2 line2
line3
line4
line5
line6

F2:

line1   stuff after a tab
lineNEW
line2 line2
line3
line4
line5
line6

这是命令:

$ (awk '{ print NR, $0 }' f1; awk '{ print NR, $0 }' f2) |\
sort -k 2 | uniq -f 1 | sort | cut -d " " -f 2-

它产生这个输出:

line1   stuff after a tab
line2 line2
lineNEW
line3
line4
line5
line6

答案 2 :(得分:1)

如果您不关心订单,只需对它们进行排序:

cat ~/file1 ~/file2 | sort -u > ~/file3