我有一个文本文件:
$ 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
行,但我想保留一份。
似乎第一种方法正确地删除了重复但没有排序,而第二种方法排序正确但删除了比我想要的更多。我该如何得到正确的结果?
答案 0 :(得分:4)
问题在于,当您向key
提供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
答案 1 :(得分:0)
对键进行排序时,您还必须提供键的结尾,否则sort也会使用以下所有键。
以下内容应该有效:
sort -t, -u -k1,1n text