免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 818 | 回复: 0
打印 上一主题 下一主题

linux命令-sort 二 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-26 15:08 |只看该作者 |倒序浏览
一、上一节我们遇到了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[color="#0000ff"]linux兄弟认为跨域的设定是个假象,并以-k 2.2,3.1来举例说明。sort从第二个域的第二个字符开始比较,一直到第二个域的最后一个字符结束,如果它发现它们相同,sort并不会去比较第三个,而是转过头去比较第一个域。
  如果不是roc[color="#0000ff"]linux兄弟提到了这个问题,我真没注意过。我自己也实验了一下,的确是这样,sort不会跨域去比较。实验结果就不贴出来了。
  但这样会产生另外一个问题:既然跨域的设定是个假象,那么指定-k的结束域还有什么意义呢?反正它不会依次去比较下一个域。我对此有困惑,有哪位兄弟知道,可以讨论一下。
  跨域是个假象,可是你又想对几个域依次进行比较,怎么办呢?用的域的优先级。不要偷懒,想要对几个域依次进行比较,就多写几个-k吧。。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/2305/showart_2007592.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP