根据共同的2列正确连接两个文件:

时间:2013-09-24 14:22:53

标签: linux join awk

我有两个文件,我正在尝试根据第1列和第2列加入/合并。 它们看起来像这样,“文件1”比文件2短得多,我想找到这两个文件的交集: 如果记录不匹配,则需要使用不同的字符串更新最后一列。

以下示例:

文件1:

1047    510 75  Live
1048    510 75  Live
1049    510 75  Live
1627    510 75  Live
1628    510 75  Live
1629    510 75  Live

文件2:

1047    510 75  Live
1048    510 75  Live
1049    510 75  Live
107     510 39  Live
108     510 39  Live
109     510 39  Live
117     510 39  Live
118     510 39  Live
119     510 39  Live
1627    510 75  Live
1628    510 75  Live
1629    510 75  Live
17      510 75  Live

目标:文件3

1047    510 75  Live
1048    510 75  Live
1049    510 75  Live
107     510 39  Test
108     510 39  Test
109     510 39  Test
117     510 39  Test
118     510 39  Test
119     510 39  Test
1627    510 75  Live
1628    510 75  Live
1629    510 75  Live
17      510 75  Test

2 个答案:

答案 0 :(得分:4)

两种方法。

使用comm获取联合和差异:

{
    # lines in common
    comm -12 <(sort file1) <(sort file2)
    # lines only in file2
    comm -13 <(sort file1) <(sort file2) | awk '{$NF="Test"} 1'
} > file3

或者,坚持使用awk

awk '
    # read and store file1
    NR==FNR {f1[$0]; next} 
    # for file2 lines not in file1, alter the last field
    !($0 in f1) {$NF = "Test"} 
    # print each line
    1
' file1 file2 > file3

您可以通过column -t管道输出以美化文件3:

awk '...' file1 file2 | column -t > file3

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r 's|^(\S+\s+\S+\s+).*|/^\1/s/.*/&/;t|;$a\s/\\S+$/Test/' file1 |
sed -rf - file2 >file3

这将从file1生成一个sed脚本,它将file2中与file1的前两个字段匹配的行替换为file1中匹配行的内容。那些不匹配的行会使用Test更新不匹配行的最后一列。结果将打印到file3。