7

我有一个文本文件:

$ 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,但事情并没有按预期进行。

方法一

$ 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行,但我想保留一份。

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

4

2 回答 2

4

问题是,当您提供一个独特的出现时keysort会寻找该特定字段。由于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
于 2013-07-25T02:19:09.890 回答
0

在对键进行排序时,您还必须提供键的结尾,否则 sort 也会使用所有后续键。

以下应该有效:

sort -t, -u -k1,1n text
于 2013-07-25T02:13:26.840 回答