根据列进行排序和去除重复项

7

I have a text file:

$ 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

$ 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

它没有按照第一列排序。

方案二

$ sort -t, -u -b -k1n,1n text
199,7,1,419,10
301,34,1,689070,1
542,8,1,418,1

它移除了542,9,1,418,1这一行,但我想保留一份副本。

第一种方法似乎去重了,但排序不正确,而第二种方法排序正确,但移除了比我想要的更多。我该如何得到正确的结果?

2个回答

4
问题在于当你给sort提供一个键时,它会查找该特定字段的唯一出现次数。由于行542,8,1,418,1被显示,sort看到下面两行以542开头,将其视为重复并过滤掉它们。
你最好的选择是要么对所有列进行排序:
sort -t, -nk1,1 -nk2,2 -nk3,3 -nk4,4 -nk5,5 -u text

使用 awk 命令过滤重复行,并将其管道传输到 sort 命令。
awk '!_[$0]++' text | sort -t, -nk1,1

uniq 要求输入文件已排序。是否可能 sort 基于第一列排序的输出不基于所有列排序? - Yang
我的猜测是,如果我使用“-nk1,5”可以基于(1、2、3、4、5)排序,那么“uniq”应该可以工作,但由于某些加密原因,它无法正常工作。 - Yang
@Yang 嗯,你也可以使用 awk '!_[$0]++' text | sort -t, -nk1,1 先过滤重复行,然后将其管道传递到排序。 - jaypal singh
谢谢,这个方法很有效。我还有一个问题,为什么“-nk1,5”不起作用?它应该是按照1、2等排序的,但输出结果却像第一种方法一样。 - Yang
1
@Yang 这不是正确的排序方式。你需要执行 sort -t, -nk1,1 -nk2,2 -nk3,3 -nk4,4 -nk5,5 -u text 来对所有列进行排序,然后从中列出 unique 行。 - jaypal singh

0

在按键排序时,您必须同时提供键的结尾,否则排序将使用所有后续键。

以下应该可以正常工作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接