0

我有一个 DCL 脚本,它创建一个看起来像这样的 .txt 文件

something,somethingelse,00000004
somethingdifferent,somethingelse1,00000002
anotherline,line,00000015

我需要按从最高到最低的第 3 列对文件进行排序:

anotherline,line,00000015
something,somethingelse,00000004
somethingdifferent,somethingelse1,00000002

最好使用排序命令,如果我看到的所有内容都需要一个位置编号,如果每行都有不同的起始位置,怎么办?

如果 sort 是一种不好的处理方法,那么还有其他方法,或者我可以在将行写入文件时以某种方式处理这个问题。

我现在只使用 VMS/DCL 几个星期,所以我还不熟悉所有命令。

谢谢!

4

2 回答 2

1

正如您已经注意到的,VMS 排序需要在记录中具有固定起始位置的字段。您不能通过分隔符指定字段。如果要使用 VMS 排序,则必须确保所有记录的第三个字段从同一列开始。换句话说,您必须填充前面的字段。如果您可以控制文件的创建方式,这可能对您有用。如果您不知道或者您不知道排序字段前面的字符串有多大,那么这可能不是一种解决方法。也许更改字段的顺序是一种选择。

另一方面,您可能会发现系统上安装了 GNV。然后你可以尝试使用它的排序,这是一种 GNU 风格的排序。也就是说,$ mcr gnv$gnu:[bin]sort -t, -k3 -r x.txt可能会得到你想要的结果。

于 2013-03-04T21:22:16.953 回答
1

VMS Sort 确实没有真正做到这一点。像你一样重新格式化是唯一的方法。

如果您无法在 OpenVMS 系统上访问 GNV 排序,那么您可能拥有或可以安装 PERL?是更容易安装。

在 perl 中当然有很多方法。例如使用匿名排序函数($a 是第一个参数,$b 第二个;<> 读取所有输入)

$ perl -e "print sort { 0+(split /,/,$b)[1] <=>  0+(split /,/,$a)[2]} <>" x.x

其中 0 + 强制数字评估。对于(固定长度?)字符串比较使用:

$ perl -e "print sort { (split /,/,$b)[2] cmp (split /,/,$a)[2]} <>" x.x

嗯,海因。enter code here

于 2013-03-05T03:59:30.547 回答