在Unix中合并两个文件时,删除重复项并为其他记录取最大值
我有两个文件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在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
因此,分组在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。