Bash 根据列对重复项进行排序并删除重复项

Bash 根据列对重复项进行排序并删除重复项,bash,shell,sorting,Bash,Shell,Sorting,我有一个文本文件: $ 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 我想根据第一列对文件进行排序,并使用sort删除重复项,但事情并没有按预期进行 方法1 它不是基于第一列进行排序 方法2 它删除了542,9,1418,1行,但我想保留一份副本 第一种方法似乎删除了重复项,但排序不正确,而第二种方法排序正确,但删除的内容超出了我的需要。如何获得正确的结果?在对键进行排序时

我有一个文本文件:

$ 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
我想根据第一列对文件进行排序,并使用
sort
删除重复项,但事情并没有按预期进行

方法1 它不是基于第一列进行排序

方法2 它删除了
542,9,1418,1
行,但我想保留一份副本


第一种方法似乎删除了重复项,但排序不正确,而第二种方法排序正确,但删除的内容超出了我的需要。如何获得正确的结果?

在对键进行排序时,还必须提供键的结尾,否则排序也会使用以下所有键

以下方面应起作用:

sort -t, -u -k1,1n text

问题是,当您向
排序
提供
时,会查找该特定字段的唯一匹配项。由于显示行
542,8,1418,1
sort
将以
542
开头的下两行视为重复行,并将其过滤掉

最好对所有列进行排序:

sort -t, -nk1,1 -nk2,2 -nk3,3 -nk4,4 -nk5,5 -u text

使用
awk
过滤重复的行并将其输送到
排序

awk '!_[$0]++' text | sort -t, -nk1,1

uniq
要求对输入文件进行排序。基于第1列的
排序的输出是否可能没有基于所有列进行排序?我的猜测是,如果我可以使用
-nk1,5
基于(1,2,3,4,5)进行排序,那么
uniq
应该可以工作,但由于某些加密原因它不工作。@Yang-Hmm,你也可以执行
awk'_[$0]+'text | sort-t,-nk1,1
先过滤重复的行,然后通过管道进行排序。谢谢,这样做了。我还有一个问题,为什么
-nk1,5
不起作用?它应该先按1排序,然后按2排序,以此类推,但输出类似于方法1,这不是正确的排序方式。您必须对所有列进行排序,然后从中列出
唯一的
行。
sort -t, -nk1,1 -nk2,2 -nk3,3 -nk4,4 -nk5,5 -u text
awk '!_[$0]++' text | sort -t, -nk1,1