使用一行的前六个字符在unix中对文件进行排序

sri*_*riv 5 unix sorting

我想使用一行的前六个字符对文件进行排序。它应该忽略第六个字符之后的默认排序顺序。我尝试使用以下命令,但系统在第六个字符之后采用默认排序顺序。

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)

Tho*_*key 6

如图所示的选项使用字段位置。如果您将其更改为类似的内容-k1.1,1.6,将使用第一个字段中的字符位置。这是一个扩展的 POSIX功能,可能在大多数平台上提供。

但是,在您的示例中,字符位置 1-6 中只有两个不同的值:088060092897。标准排序命令没有忽略列的功能,但仅适用于使用列。虽然 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选项。使用该选项,程序会生成请求的输出。