在Unix中合并两个文件时,删除重复项并为其他记录取最大值

在Unix中合并两个文件时,删除重复项并为其他记录取最大值,unix,awk,Unix,Awk,我有两个文件a.txt和b.txt,每个文件有6列。我想合并这两个文件,并删除完全重复的基础上所有6列,而对于其他情况,我想有最大的第3,4,5,6列的基础上分组列1和2。我想通过下面的一个例子来解释这一点 文件a.txt Col1 Col2 Col3 Col4 Col5 Col6 A1 B1 1 a2b21001 文件b.txt Col1 Col2 Col3 Col4 Col5 Col6 A1 B1 1 A2 B2 0 1 0 1 结果应该是: Col1 Col2 Col3 Col4 Col5

我有两个文件a.txt和b.txt,每个文件有6列。我想合并这两个文件,并删除完全重复的基础上所有6列,而对于其他情况,我想有最大的第3,4,5,6列的基础上分组列1和2。我想通过下面的一个例子来解释这一点

文件a.txt

Col1 Col2 Col3 Col4 Col5 Col6

A1 B1 1

a2b21001

文件b.txt

Col1 Col2 Col3 Col4 Col5 Col6

A1 B1 1

A2 B2 0 1 0 1

结果应该是:

Col1 Col2 Col3 Col4 Col5 Col6

A1 B1 1

A2 B2 1 1 0 1


因此,分组在Col1和Col2上,如果其他4列在两个文件中具有相同的值,则它们是完全重复的,应删除重复项,但如果它们在两个文件中具有不同的值,则应使用混合的
排序-u
选择最大值或1,以消除重复项并找到每个文件的最大值组的列使其变得微不足道:

$sort-u a.txt b.txt | datamash-W-g1,2最大值3-6
A1 B1 1
A2 B2 1 1 0 1

两步方法会更简单

首先定义一个函数来创建join的键

$ f() { awk '{print $1"_"$2 "\t" $0}' "$1" | sort; }
用键连接文件,让awk选择每个字段的最大值

$ join <(f file1) <(f file2) | 
  awk 'function max(x,y) {return x>y?x:y}
      {n=(NF+1)/2; 
       printf "%s %s",$2,$3; 
       for(i=4;i<=n;i++) printf " %s",max($i,$(i+n-1)); 
       print ""}'

A1 B1 1 1 1 1
A2 B2 1 1 0 1

$加入欢迎加入SO,在SO上,我们鼓励用户在他们的问题中添加他们的努力,因此请用您的努力编辑您的问题(这里没有对错,因为我们都是来学习的),然后让我们知道。您能解释一下选择最大值或1是什么意思吗。因此,如果我有
A0012
A0093
结果应该是
A0013
?嗨,实际上值是1或0,因此如果任何一个文件的值为1,则应选择1,如果两者都为0,则应选择0。谢谢您的回复,但问题是我们的服务器上无法提供datamash。