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

时间:2015-06-01 09:28:16

标签: sorting unix

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

sort -k 1,6 filename.txt

输入文件:" filename.txt"

09289720150531N201505220820D20150514
09289720150531N201505220820A20150516
08806020150531N201505290810D20150526
08806020150531N201505290810A20150528

输出应为:

08806020150531N201505290810D20150526
08806020150531N201505290810A20150528
09289720150531N201505220820D20150514
09289720150531N201505220820A20150516

但我的命令输出是:

08806020150531N201505290810A20150528
08806020150531N201505290810D20150526
09289720150531N201505220820A20150516
09289720150531N201505220820D20150514

1 个答案:

答案 0 :(得分:3)

显示的选项使用字段位置。如果您将其更改为-k1.1,1.6,则会在第一个字段中使用字符位置。这是extended POSIX功能,可能会在大多数平台上提供。

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