Linux 基于共有2列正确连接两个文件:
根据第1列和第2列,我有两个文件正试图加入/合并。 它们看起来像这样,“文件1”比文件2短得多,我想找出这两个文件的交叉点: 如果记录不匹配,则需要使用不同的字符串更新最后一列 示例如下: 文件1: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
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中该记录的最后一列。我希望这是清楚的。请在问题中增加额外的要求。