当前位置导航:炫浪网>>网络学院>>操作系统>>Linux教程

linux命令实践-sort 二

    一、上一节我们遇到了3nr这样写的选项,这是怎么回事呢?

  这种与指定域合写在一起的字符称为修饰符(modifier),它与和它同名的选项功能相同。

  二、都有哪些修饰符呢?

  帮助文档有些有解释说:A sort key position may also have any of the option letters `Mbdfinr' appended to it, in which case the global ordering options are not used for that particular field.

  这段话明确的告诉我们,常用的修饰符有:-M、-b、-d、-f、-i、-n、-r。

  除了-i,其它的前面都已经提到过。

  -i修饰符功能是忽略不可打印字符,如/n表示换行,/r表示回车,/t表示制表符。帮助文档中是这么解释的: Ignore nonprinting characters.  The `LC_CTYPE' locale determines character types.  This option has no effect if the stronger  `--dictionary-order' (`-d') option is also given.

    三、修饰符和选项有什么区别么?

  它们的功能完全相同,只在作用范围上有区别。

  帮助文档在介绍sort的选项时有这么一句话:The following options affect the ordering of output lines.  They may be specified globally or as part of a specific key field.  If no key fields are specified, global options apply to comparison of entire lines; otherwise the global options are inherited by key fields that do not specify any special options of their own.

  这段话中,as part of a specific key field应该就是指把选项作为修饰符,any special options of their own指的也是修饰符。这段话解释了选项的作用范围:它会被那些没有指定自己修饰符的域所继承。

  帮助文档对修饰符的解释则指明了:如果一个域有自己的修饰符,全局选项对它没有用。

  帮助文档中有一个例子以及对它的解释应该能对此作出示范:

    sort -t : -k 5b,5 -k 3,3n /etc/passwd

    sort -t : -n -k 5b,5 -k 3,3 /etc/passwd

    sort -t : -b -k 5,5 -k 3,3n /etc/passwd

  These three commands have equivalent effect.  The first specifies that the first key's start position ignores leading blanks and the second key is sorted numerically.  The other two commands rely on global options being inherited by sort keys that lack modifiers.

  帮助文档对这个例子的解释明确告诉我们:这三个命令是等价的,第一个指定域忽略前导空白,第二个指定域按数值排序;第二个和第三个命令中的全局选项被缺少修饰符的关键域所继承了。

  不过,我对此尚有疑问:全局选项是不是真的不能被那些已经指定了修饰符的域所继承?也就是说,全局选项是不是真的对那些已经指定了修饰符的域无效?我实验了一些,结果令我比较迷惑:感觉有时候好像是这样,但是有的时候又好像不是这样。如果哪位仁兄对此有较深的了解,望不吝赐教。

  四、上面的例子中,在同一个命令中怎么出现了两个-k选项?

  Sort的-k选项可以设置优先级,即:你可以指定对哪个域排序,后对哪个域排序。例子中的命令会先对第五个域排序,如果遇到第五域相同的行,再对它们的第三个域排序。

  五、-k 5,5和-k3,3是什么意思?

  -k选项的具体语法是这样的:[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

  FStart是开始域,CStart是开始域的开始字符,Modifier是修饰符,FEnd是结束域,CEnd是结束域的结束字符。开始部分和结束部分用逗号隔开。

  它们都可以省略,省略了开始域,意味着从第一个域开始到指定域结束;省略了域的开始字符,意味着从域的第一个字符开始到第后一个字符结束;

  例子中的-k 5,5是指第五个域,从第五个域开始,到第五个域结束。如果是-k 5.3,5.4则是指从第五个域的第三个字符开始,到第五个域的第四个字符结束。

  六、关于跨域的问题。

  Sort是支持跨域的,帮助文档中说:Keys can span multiple fields.

  但是roc兄弟认为跨域的设定是个假象,并以-k 2.2,3.1来举例说明。sort从第二个域的第二个字符开始比较,一直到第二个域的最后一个字符结束,如果它发现它们相同,sort并不会去比较第三个,而是转过头去比较第一个域。

  如果不是roc兄弟提到了这个问题,我真没注意过。我自己也实验了一下,的确是这样,sort不会跨域去比较。实验结果就不贴出来了。

  但这样会产生另外一个问题:既然跨域的设定是个假象,那么指定-k的结束域还有什么意义呢?反正它不会依次去比较下一个域。我对此有困惑,有哪位兄弟知道,可以讨论一下。

  跨域是个假象,可是你又想对几个域依次进行比较,怎么办呢?用的域的优先级。不要偷懒,想要对几个域依次进行比较,就多写几个-k吧。。
炫浪学院 Linux教程

相关内容
赞助商链接