我想使用一行的前六个字符对文件进行排序。 它应该忽略第六个字符后的默认排序顺序。 我尝试使用以下命令,但系统在第六个字符后采用默认排序顺序。
sort -k 1,6 filename.txt
输入文件:" filename.txt"
09289720150531N201505220820D20150514
09289720150531N201505220820A20150516
08806020150531N201505290810D20150526
08806020150531N201505290810A20150528
输出应为:
08806020150531N201505290810D20150526
08806020150531N201505290810A20150528
09289720150531N201505220820D20150514
09289720150531N201505220820A20150516
但我的命令输出是:
08806020150531N201505290810A20150528
08806020150531N201505290810D20150526
09289720150531N201505220820A20150516
09289720150531N201505220820D20150514
答案 0 :(得分:3)
显示的选项使用字段位置。如果您将其更改为-k1.1,1.6
,则会在第一个字段中使用字符位置。这是extended POSIX功能,可能会在大多数平台上提供。
但是,在您的示例中,字符位置1-6中只有两个不同的值:088060
和092897
。标准排序命令没有忽略列的功能,但仅适用于使用列。虽然GNU sort提供了一个扩展(-s
用于"禁用最后的比较"),但Solaris排序没有这样的扩展。在考虑了排序键之后,它将按其余行排序。
在其手册中有一些模糊的措辞,暗示-u
会做你想做的事情:
当存在多个关键字段时,仅在所有较早的关键字相等时才比较以后的关键字。除非指定了
-u
选项,否则将按比较排序的行排序,就好像没有选项-d
,-f
,-i
,-n
或{ {1}}存在(但-k
仍然有效,如果已指定)并且行中的所有字节对比较都很重要。
然而 - 重新审视这一点 - 由于-r
用于过滤重复项,因此这一措辞具有误导性。
评论表明-u
可以缩短为-k1.1,1.6
,并且使用Solaris 10进行的测试证实这可行。那当然是-k1.6
。在我的Solaris 10副本中,/usr/bin/sort
中还有一个排序副本:
/opt/sfw/bin/sort
和 程序支持上面提到的$ /opt/sfw/bin/sort --version
sort (GNU coreutils) 5.97
选项。使用该选项,程序将生成所请求的输出。