Linux 基于共有2列正确连接两个文件:

Linux 基于共有2列正确连接两个文件:,linux,join,awk,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 Li

根据第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
两种方法

使用
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
您可以通过管道将输出通过
列-t
来美化文件3:

awk '...' file1 file2 | column -t > file3
两种方法

使用
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
您可以通过管道将输出通过
列-t
来美化文件3:

awk '...' file1 file2 | column -t > file3
这可能适用于您(GNU-sed):

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

这可能适用于您(GNU-sed):


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

如果上面的第二个文件中存在
1047 510 39 Live
,那么输出应该是什么?是来自文件1的行,还是来自文件2的行,或者两行都是,还是其他什么?@Imran-欢迎来到SO!到目前为止你试着做什么?如果您不说明自己为合并所做的尝试,您可能不会得到太多帮助。文件1和文件2:每个文件的前两列都是主键,应该用于比较这两个文件。比较文件2和文件1的记录。如果文件1中存在记录,则将文件2中的记录替换为文件1中的记录如果在文件1中未找到记录,则仅更新文件2中该记录的最后一列。我希望这是清楚的。我尝试了awk,但在处理了一些记录后失败了。awk'FNR==NR{a[$1,$2]=$3;next}($1,$2)在{print$0,a[$1,$2]}'中,如果上面的第二个文件中存在
1047 510 39 Live
,那么输出应该是什么?是来自文件1的行,还是来自文件2的行,或者两行都是,还是其他什么?@Imran-欢迎来到SO!到目前为止你试着做什么?如果您不说明自己为合并所做的尝试,您可能不会得到太多帮助。文件1和文件2:每个文件的前两列都是主键,应该用于比较这两个文件。比较文件2和文件1的记录。如果文件1中存在记录,则将文件2中的记录替换为文件1中的记录如果在文件1中未找到记录,则仅更新文件2中该记录的最后一列。我希望这是清楚的。我尝试了awk,但在处理了一些记录后失败了。awk'FNR==NR{a[$1,$2]=$3;next}($1,$2)在a{print$0,a[$1,$2]}中。谢谢你的回复。我的问题有点复杂。我有两个文件:文件1和文件2每个文件的前两列都是主键,应该用来比较这两个文件。比较文件2和文件1的记录。如果文件1中存在记录,则将文件2中的记录替换为文件1中的记录如果在文件1中未找到记录,则仅更新文件2中该记录的最后一列。我希望它是清楚的。请在问题中添加额外的要求。嗨,格伦。谢谢你的回复。我的问题有点复杂。我有两个文件:文件1和文件2每个文件的前两列都是主键,应该用来比较这两个文件。比较文件2和文件1的记录。如果文件1中存在记录,则将文件2中的记录替换为文件1中的记录如果在文件1中未找到记录,则仅更新文件2中该记录的最后一列。我希望这是清楚的。请在问题中增加额外的要求。