我想使用一行的前六个字符对文件进行排序。它应该忽略第六个字符之后的默认排序顺序。我尝试使用以下命令,但系统在第六个字符之后采用默认排序顺序。
sort -k 1,6 filename.txt
Run Code Online (Sandbox Code Playgroud)
输入文件:“文件名.txt”
09289720150531N201505220820D20150514
09289720150531N201505220820A20150516
08806020150531N201505290810D20150526
08806020150531N201505290810A20150528
Run Code Online (Sandbox Code Playgroud)
输出应该是:
08806020150531N201505290810D20150526
08806020150531N201505290810A20150528
09289720150531N201505220820D20150514
09289720150531N201505220820A20150516
Run Code Online (Sandbox Code Playgroud)
但我的命令输出是:
08806020150531N201505290810A20150528
08806020150531N201505290810D20150526
09289720150531N201505220820A20150516
09289720150531N201505220820D20150514
Run Code Online (Sandbox Code Playgroud)
如图所示的选项使用字段位置。如果您将其更改为类似的内容-k1.1,1.6,将使用第一个字段中的字符位置。这是一个扩展的 POSIX功能,可能在大多数平台上提供。
但是,在您的示例中,字符位置 1-6 中只有两个不同的值:088060和092897。标准排序命令没有忽略列的功能,但仅适用于使用列。虽然 GNU sort 提供了一个扩展(-s用于“禁用最后的比较”),但 Solaris sort 没有这样的扩展。在考虑了排序键之后,它会按行的其余部分进行排序。
还有就是它的手册中一些模糊的措辞暗示这是-u你要会做什么:
当有多个键字段时,仅在所有较早的键比较相等后才比较较晚的键。除非
-u指定了 选项,否则比较相等的行将被排序,就好像没有选项-d,-f,-i,-n或-k存在(但-r仍然有效,如果它被指定)并且行中的所有字节对比较重要。
然而 - 重新审视这个 - 来自this的措辞具有误导性,因为-u用于过滤重复项。
评论建议-k1.1,1.6可以缩短为-k1.6,并且使用 Solaris 10 进行的测试确认可以正常工作。那是/usr/bin/sort,当然。在我的 Solaris 10 副本中,还有一个额外的 sort 副本,位于/opt/sfw/bin/sort:
$ /opt/sfw/bin/sort --version
sort (GNU coreutils) 5.97
Run Code Online (Sandbox Code Playgroud)
并且该程序支持上述-s选项。使用该选项,程序会生成请求的输出。