Text 重复删除基于两个字段,同时在第三个字段中保留最低值
我想删除txt文件中包含这三列的重复项。重复项是具有相同“id”和“descr”的项,我只需要保留最低值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
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