Text 重复删除基于两个字段,同时在第三个字段中保留最低值

Text 重复删除基于两个字段,同时在第三个字段中保留最低值,text,awk,duplicates,Text,Awk,Duplicates,我想删除txt文件中包含这三列的重复项。重复项是具有相同“id”和“descr”的项,我只需要保留最低值 id1 descr1 0.9 id1 descr1 1.23 id1 descr1 0.3 id1 descr2 0.5 id2 descr2 23.1 id3 descr3 1.2 id3 descr3 14.3 id3 descr3 0.5 id3 descr3 0.34 id3 descr4 4.5 因此,我想收到以下信息 id1 descr1 0.3 id1

我想删除txt文件中包含这三列的重复项。重复项是具有相同“id”和“descr”的项,我只需要保留最低值

id1 descr1  0.9
id1 descr1  1.23
id1 descr1  0.3
id1 descr2  0.5
id2 descr2  23.1
id3 descr3  1.2
id3 descr3  14.3
id3 descr3  0.5
id3 descr3  0.34
id3 descr4  4.5
因此,我想收到以下信息

id1 descr1  0.3
id1 descr2  0.5
id2 descr2  23.1
id3 descr3  0.34
id3 descr4  4.5
现在,我有以下窍门

sort -k1,1 -k2,2 -k3,3n file.txt

第一次出现field1+field2时,该如何处理?

您喜欢这样的情况:

awk '{s=$1 FS $2;a[s]=a[s]<$3&&a[s]?a[s]:$3} END { for (i in a) print i,a[i]}' file
id1 descr1 0.3
id2 descr2 23.1
id1 descr2 0.5
id3 descr3 0.34
id3 descr4 4.5
awk'{s=$1fs$2;a[s]=a[s]
现在我们正在删除包含相同
第一个和第二个
字段的行。为此,我们使用索引为
$1space$2
的数组
a
。由于我们第一次递增
a[$1”“$2]
,下一次出现相同的
第一个和第二个
字段将被忽略,因为
a[$1”“$2]
将不为0,因此[$1”“$2]
将为false。

仅使用排序:

~$ sort -t' ' -k4n myfile|sort -k1,2 -t' ' -u

首先,使用第四个字段进行数字排序(使用空格作为分隔符,数字位于第四个字段上,因为前面有两个连续的空格):

然后用
-u
删除第一个和第二个字段的重复行:

~$ sort -t' ' -k4n myfile|sort -k1,2 -t' ' -u
id1 descr1  0.3
id1 descr2  0.5
id2 descr2  23.1
id3 descr3  0.34
id3 descr4  4.5

你应该在
$1
$2
之间添加一些空格或分隔符。如果没有,我看到它会失败(取决于输入数据)。有些像
awk'!a[$1FS$2]+'
awk'!a[$1”“$2]+'
你能解释一下吗?“!a[$1$2]+'部分?@JohnAmraph the
!x[$0]++“
是在
awk
中删除重复行的一种方法。在谷歌上搜索
awk remove duplicate
,你会发现一些关于它如何工作的解释。可能想将
&&a[s]
更改为
&&(s中的a)
,因为它可以是零,而不是更新:)@Jidder我以前没有见过它这样做过,
(s中的a)
给出此错误:
awk:cmd.line:1:(FILENAME=t FNR=1)致命:尝试在标量上下文中使用数组“a”
意味着
(a中的s)
对不起!@Jidder如果我使用了
(a中的s)
我不会得到任何数据输出。试试
(a中的s)&&a[s]
sdlcb@Goofy-Gen:~/AMD$ cat File
id1 descr1  0.9
id1 descr1  1.23
id1 descr1  0.3
id1 descr2  0.5
id2 descr2  23.1
id3 descr3  1.2
id3 descr3  14.3
id3 descr3  0.5
id3 descr3  0.34
id3 descr4  4.5
sdlcb@Goofy-Gen:~/AMD$ sort -k 3 < File | awk '!a[$1" "$2]++'
id1 descr1  0.3
id3 descr3  0.34
id1 descr2  0.5
id2 descr2  23.1
id3 descr4  4.5
id1 descr1  0.3
id3 descr3  0.34
id1 descr2  0.5
id3 descr3  0.5
id1 descr1  0.9
id3 descr3  1.2
id1 descr1  1.23
id3 descr3  14.3
id2 descr2  23.1
id3 descr4  4.5
~$ sort -t' ' -k4n myfile|sort -k1,2 -t' ' -u
~$ sort -t' ' -k4n myfile
id1 descr1  0.3
id1 descr1  0.9
id1 descr2  0.5
id3 descr3  0.34
id3 descr3  0.5
id1 descr1  1.23
id3 descr3  1.2
id3 descr4  4.5
id3 descr3  14.3
id2 descr2  23.1
~$ sort -t' ' -k4n myfile|sort -k1,2 -t' ' -u
id1 descr1  0.3
id1 descr2  0.5
id2 descr2  23.1
id3 descr3  0.34
id3 descr4  4.5