根据列排序和删除重复项

时间:2013-07-25 02:02:12

标签: 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

$ 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

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

方法2

$ 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 个答案:

答案 0 :(得分:4)

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

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

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

使用awk过滤重复的行并将其传递给sort

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

答案 1 :(得分:0)

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

以下内容应该有效:

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