根据列排序和删除重复项

Yan*_*ang 7 sorting bash shell

我有一个文本文件:

$ cat text
542,8,1,418,1
542,9,1,418,1
301,34,1,689070,1
542,9,1,418,1
199,7,1,419,10
Run Code Online (Sandbox Code Playgroud)

我想根据第一列对文件进行排序,并使用删除重复项sort,但事情并没有按预期进行.

方法1

$ sort -t, -u -b -k1n text
542,8,1,418,1
542,9,1,418,1
199,7,1,419,10
301,34,1,689070,1
Run Code Online (Sandbox Code Playgroud)

它不是基于第一列进行排序.

方法2

$ sort -t, -u -b -k1n,1n text
199,7,1,419,10
301,34,1,689070,1
542,8,1,418,1
Run Code Online (Sandbox Code Playgroud)

它会删除该542,9,1,418,1行,但我想保留一份副本.

似乎第一种方法正确地删除了重复但没有排序,而第二种方法排序正确但删除了超出我想要的数量.我该如何得到正确的结果?

jay*_*ngh 4

问题是,当您提供 a 时,系统会查找该特定字段的唯一出现次数key。由于显示了sort该行,因此会将接下来的两行视为重复,并将其过滤掉。542,8,1,418,1sort542

您最好的选择是对所有列进行排序:

sort -t, -nk1,1 -nk2,2 -nk3,3 -nk4,4 -nk5,5 -u text
Run Code Online (Sandbox Code Playgroud)

或者

用于awk过滤重复行并将其通过管道传输到sort.

awk '!_[$0]++' text | sort -t, -nk1,1
Run Code Online (Sandbox Code Playgroud)