linux sort uniqITeyealibaba - 乐橙lc8

linux sort uniqITeyealibaba

2019-02-02 11:25:36 | 作者: 鸿振 | 标签: 排序,文件,字符 | 浏览: 4031

sort [-bcdfimMnr][-o 输出文件 ][-t 分隔字符 ][+ 开端栏位 - 完毕栏位 ][help][verison][文件]

弥补阐明: sort可针对文本文件的内容,以行为单位来排序。

参 数:   -b    疏忽每行前面开端出的空格字符。
   -c    查看文件是否现已依照次序排序。
   -d    排序时,处理英文字母、数字及空格字符外,疏忽其他的字符。
   -f    排序时,将小写字母视为大写字母。
   -i    排序时,除了040至176之间的ASCII字符外,疏忽其他的字符。
   -m    将几个排序好的文件进行兼并。
   -M    将前面3个字母依照月份的缩写进行排序。
   -n    依照数值的巨细排序。
   -o 输出文件     将排序后的成果存入指定的文件。
   -r    以相反的次序来排序。
   -t 分隔字符     指定排序时所用的栏位分隔字符。
   + 开端栏位 - 完毕栏位     以指定的栏位来排序,规模由开端栏位到完毕栏位的前一栏位。
   help    显现协助。
   version    显现版别信息。

运用实例

要在 LC_ALL、LC_COLLATE 或 LANG 环境变量设置为 En_US 的状况下排序 fruits 文件 ,请输入:

LANG=En_US sort fruits此指令序列显现以升序词典次序排序的 fruits 文件的内容。每一列的字符,包括空格、数字和特别字符都经逐个比较。 例如,假如 fruits 文件包括文本:bananaorangePersimmonapple%%bananaappleORANGEsort 指令显现:%%bananaORANGEPersimmonappleapplebananaorange在 ASCII 收拾序列中,%(百分号)在大写字母前,大写字母在小写字母前。假如您当时的言语环境指定 ASCII 之外的字符集,成果或许不同。

要以字典次序排序,请输入:

sort -d fruits此指令序列排序和显现 fruits 文件的内容,并且只比较字母、数字和空格。假如 fruits 文件与示例 1 相同,那么 sort 指令显现: ORANGEPersimmonappleapple%%bananabananaorange-d 标志疏忽 %(百分号)字符,由于它不是个字母、数字或空格。(即 %%banana 被 banana 替代)。

要将包括大写字母和具有相似小写行的特别字符行分组,请输入:

sort -d -f fruits

-d 标志疏忽特别字符,-f 标志疏忽巨细写差异。将 LC_ALL、LC_COLLATE 或 LANG 环境变量设置为 C 的状况下,fruits 文件的输出成果变为: appleapple%%bananabananaORANGEorangePersimmon

要除掉重复行排序,请输入:

sort -d -f -u fruits

-u 标志通知 sort 指令除掉重复的行,使文件中的每一行仅有。此指令序列显现: apple%%bananaORANGEPersimmon不只除掉重复的 apple,并且也除掉了 banana 和 ORANGE。除掉这些是由于 -d 标志疏忽 %% 这个特别字符,-f 标志疏忽巨细写差异。

要如上面那样排序,除掉重复的实例(除非是大写字母或标点不同),请输入:

sort -u +0 -d -f +0 fruits输入 +0 -d -f 完结的排序与示例 3 中 -d -f 的排序类型相同,+0 进行另一项比较以区别不相同的行。这避免 -u 标志将它们除掉。 示例 1 所示的 fruits 文件中,增加的 +0 将 %%banana 与 banana 及 ORANGE 与 orange 区别开来。可是,apple 的两个实例是相同的,所以其间之一被删去。apple%%bananabananaORANGEorangePersimmon

要指定分隔字段的字符,请输入:

sort -t: +1 vegetables

此指令序列排序 vegetables 文件,对每一行上榜首个冒号后的文本进行比较。+1 通知 sort 指令疏忽榜首字段,从第二字段的开端到该行的完毕进行比较。-t: 标志通知 sort 指令冒号分隔字段。

 

假如 vegetables 包括:

 

yams:104turnips:8potatoes:15carrots:104green beans:32radishes:5lettuce:15那么,将 LC_ALL、LC_COLLATE 或 LANG 环境变量设置为 C 的状况下,sort 指令将显现:carrots:104yams:104lettuce:15potatoes:15green beans:32radishes:5turnips:8留意数字没有依照数字排序。当用字典式分类从左至右比较每一个字符时呈现这种状况。换句话说,3 在 5 之前,所以 32 在 5 之前。

要排序数字,请输入:

sort -t: +1 -n vegetables

此指令序列依照第二个字段对 vegetables 文件进行数字排序。假如 vegetables 文件与示例 6 中的相同,那么 sort 指令将显现: radishes:5turnips:8lettuce:15potatoes:15green beans:32carrots:104yams:104

要对多个字段排序,请输入:

sort -t: +1 -2 -n +0 -1 -r vegetables或 sort -t: -k2,2 n -k1,1 r vegetables

此指令序列对第二字段(+1 -2 -n)进行数字排序。在这个次序中,它以逆字母次序(+0 -1 -r)对榜首字段排序。将 LC_ALL、LC_COLLATE 或 LANG 环境变量设置为 C 的状况下,输出将相似于: radishes:5turnips:8potatoes:15lettuce:15green beans:32yams:104carrots:104

此指令按数字次序对行排序。当两行数字相一同,它们以逆字母次序呈现。

 

要运用排序的文本替换原始文件,请输入:

sort -o vegetables vegetables此指令序列将排序输出存入 vegetables 文件( -o vegetables)。

 

 

 

正文开端] 有时分学习脚本,你会发现sort指令后边跟了一堆相似-k1,2,或许-k1.2 -k3.4的东东,有些匪夷所思。今日,咱们就来搞定它—-k选项!

1 预备资料

$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

 

榜首个域是公司名称,第二个域是公司人数,第三个域是职工平均工资。(除了公司名称,其他的别信,都瞎写的^_^)

2 我想让这个文件按公司的字母次序排序,也就是按榜首个域进行排序:(这个facebook.txt文件有三个域)

$ sort -t ‘ ‘ -k 1 facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

看到了吧,就直接用-k 1设定就能够了。(其实此处并不严厉,稍后你就会知道)

3 我想让facebook.txt依照公司人数排序

$ sort -n -t ‘ ‘ -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

不必解说,我相信你能懂。

可是,此处呈现了问题,那就是baidu和sohu的公司人数相同,都是100人,这个时分怎样办呢?依照默许规则,是从榜首个域开端进行升序排序,因而baidu排在了sohu前面。

4  我想让facebook.txt依照公司人数排序 ,人数相同的依照职工平均工资升序排序:

$ sort -n -t ‘ ‘ -k 2 -k 3 facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

看,咱们加了一个-k2 -k3就处理了问题。对滴,sort支撑这种设定,就是说设定域排序的优先级,先以第2个域进行排序,假如相同,再以第3个域进行排序。(假如你情愿,能够一向这么写下去,设定很多个排序优先级)

5 我想让facebook.txt依照职工工资降序排序,假如职工人数相同的,则依照公司人数升序排序:(这个有点难度喽)

$ sort -n -t ‘ ‘ -k 3r -k 2 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

此处有运用了一些小技巧,你细心看看,在-k 3后边悄悄加上了一个小写字母r。你想想,再结合咱们 ,能得到答案么?揭晓:r和-r选项的作用是相同的,就是表明逆序。由于sort默许是依照升序排序的,所以此处需求加上r表明第三个域(职工平均工资)是依照降序排序。此处你还能够加上n,就表明对这个域进行排序时,要依照数值巨细进行排序,举个比方吧:

$ sort -t ‘ ‘ -k 3nr -k 2n facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

看,咱们去掉了最前面的-n选项,而是将它参加到了每一个-k选项中了。

6 -k选项的详细语法格局

要继续往下深化的话,就不得不来点理论知识。你需求了解-k选项的语法格局,如下:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

这个语法格局能够被其间的逗号(“,”)分为两大部分,Start部分和End部分。

先给你灌注一个思维,那就是“假如不设定End部分,那么就以为End被设定为行尾”。这个概念很重要的,但往往你不会注重它。

Start部分也由三部分组成,其间的Modifier部分就是咱们之前说过的相似n和r的选项部分。咱们要点说说Start部分的FStart和C.Start。

C.Start也是能够省掉的,省掉的话就表明从本域的最初部分开端。之前比方中的-k 2和-k 3就是省掉了C.Start的比方喽。

FStart.CStart,其间FStart就是表明运用的域,而CStart则表明在FStart域中从第几个字符开端算“排序首字符”。

同理,在End部分中,你能够设定FEnd.CEnd,假如你省掉.CEnd,则表明完毕到“域尾”,即本域的最终一个字符。或许,假如你将CEnd设定为0(零),也是表明完毕到“域尾”。

7 突发奇想,从公司英文名称的第二个字母开端进行排序:

$ sort -t ‘ ‘ -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000

看,咱们运用了-k 1.2,这就表明对榜首个域的第二个字符开端到本域的最终一个字符停止的字符串进行排序。你会发现baidu由于第二个字母是a而名列榜首。sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者别离排在第二和第三。guge只能屈居第四了。

8 又突发奇想,,只针对公司英文名称的第二个字母进行排序,假如相同的依照职工工资进行降序排序:

$ sort -t ‘ ‘ -k 1.2,1.2 -k 3,3nr facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

由于只对第二个字母进行排序,所以咱们运用了-k 1.2,1.2的表明办法,表明咱们“只”对第二个字母进行排序。(假如你问“我运用-k 1.2怎样不行?”,当然不行,由于你省掉了End部分,这就意味着你将对从第二个字母起到本域最终一个字符停止的字符串进行排序)。关于职工工资进行排 序,咱们也运用了-k 3,3,这是最精确的表述,表明咱们“只”对本域进行排序,由于假如你省掉了后边的3,就变成了咱们“对第3个域开端到最终一个域方位的内容进行排序” 了。

9 在modifier部分还能够用到哪些选项?

能够用到b、d、f、i、n 或 r。

其间n和r你必定现已很熟悉了。

b表明疏忽本域的报到空白符号。

d表明对本域依照字典次序排序(即,只考虑空白和字母)。

f表明对本域疏忽巨细写进行排序。

i表明疏忽“不行打印字符”,只针对可打印字符进行排序。(有些ASCII就是不行打印字符,比方\a是报警,\b是退格,\n是换行,\r是回车等等)

10 考虑考虑关于-k和-u联合运用的比方:

$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

这是最原始的facebook.txt文件。

$ sort -n -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

$ sort -n -k 2 -u facebook.txt
guge 50 3000
baidu 100 5000
google 110 5000

当设定以公司职工域进行数值排序,然后加-u后,sohu一行就被删去了!本来-u只识别用-k设定的域,发现相同,就将后续相同的行都删去。

$ sort  -k 1 -u facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

$ sort  -k 1.1,1.1 -u facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500

这个比方也同理,最初字符是g的guge就没有幸免于难。

$ sort -n -k 2 -k 3 -u facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

咦!这儿设置了两层排序优先级的状况下,运用-u就没有删去任何行。本来-u是会权衡一切-k选项,将都相同的才会删去,只需其间有一级不同都不会容易删去的:)(不信,你能够自己加一行sina 100 4500试试看)

11 最怪异的排序:

$ sort -n -k 2.2,3.1 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

以第二个域的第二个字符开端到第三个域的榜首个字符完毕的部分进行排序。

榜首行,会提取0 3,第二行提取00 5,第三行提取00 4,第四行提取10 5。

又由于sort以为0小于00小于000小于0000….

因而0 3必定是在榜首个。10 5必定是在最终一个。但为什么00 5却在00 4前面呢?(你能够自己做试验考虑一下。)

答案揭晓:本来“跨域的设定是个假象”,sort只会比较第二个域的第二个字符到第二个域的最终一个字符的部分,而不会把第三个域的最初字符归入比较规模。当发现00和00相一同,sort就会主动比较榜首个域去了。当然baidu在sohu前面了。用一个典范即可证明:

$ sort -n -k 2.2,3.1 -k 1,1r facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

12 有时分在sort指令后会看到+1 -2这些符号,这是什么东东?

关于这种语法,最新的sort是这么进行解说的:

On older systems, `sort’ supports an obsolete origin-zero syntax `+POS1 [-POS2]‘ for specifying sort keys.  POSIX 1003.1-2001 (*note Standards conformance::) does not allow this; use `-k’ instead.

本来,这种陈旧的表明办法现已被筛选了,今后能够振振有词的轻视运用这种表明办法的脚本喽!

(为了避免陈旧脚本的存在,在这再说一下这种表明办法,加号表明Start部分,减号表明End部分。最最重要的一点是,这种办法办法是从0开端计数的,曾经所说的榜首个域,在此被表明为第0个域。曾经的第2个字符,在此表明为第1个字符。理解?)

完毕语:

本文是互联网上仅有的比较全的关于sort的k选项的论说文章,如需转载请有必要注明“转自Linux大棚-Linux主题博客”,谢谢各位:)

sort的-k选项根本就是这堆内容了,假如我们有什么弥补,就留言吧:) 欢迎沟通!

over~

 

 

uniq指令

文件通过处理后在它的输出文件中或许会呈现重复的行。例如,运用cat指令将两个文件兼并后,再运用sort指令进行排序,就或许呈现重复行。这时能够运用uniq指令将这些重复行从输出文件中删去,只留下每条记载的仅有样本。

语法:uniq [选项] 文件

阐明:这个指令读取输入文件,并比较相邻的行。在正常状况下,第二个及今后更多个重复即将被删去,行比较是依据所用字符集的排序序列进行的。该指令加工后的成果写到输出文件中。输入文件和输出文件有必要不同。假如输入文件用“- ”表明,则从规范输入读取。

该指令各选项意义如下:、

- c 显现输出中,在每行行首加上本行在文件中呈现的次数。它可替代- u和- d选项。

- d 只显现重复行 。

- u 只显现文件中不重复的各行 。

- n 前n个字段与每个字段前的空白一同被疏忽。一个字段是一个非空格、非制表符的字符串,互相由制表符和空格离隔(字段从0开端编号)。

前n个字符被疏忽,之前的字符被越过(字符从0开端编号)。

- f n 与- n相同,这儿n是字段数。

- s n 与+n相同,这儿n是字符数。

例如:

1. 显现文件example中不重复的行。

uniq - u example

2. 显现文件example中不重复的行,从第2个字段的第2个字符开端做比较。

uniq - u - 1 +1 example

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表乐橙lc8立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2

    常用工具alibaba

    日志,检查,监控
  • 3
  • 4
  • 5

    pthread快报

    线程,运转,调用
  • 6

    linux 解压rarmingxing

    原生,指令
  • 7

    Linux常用端口sohu

    协议,效劳,端口
  • 8

    apache 的modguojizaixian

    状况,指令,检查
  • 9

    epoll学习ITeye快报

    数据,事情,形式
  • 10

    linux sort uniqITeyealibaba

    排序,文件,字符