shell命令之sort

[Shell学习笔记] sort、uniq命令对文本进行排序、单一和重复操作

文章目录

[隐藏]

sort是在Linux里非常常用的一个命令,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。

sort命令语法

sort 选项 参数

常用选项

  • -b:忽略每行前面开始处的空格字符;
  • -c:检查文件是否已经按照顺序排序,排序过为真;
  • -d:排序时,处理英文字母、数字和空格字符,以字典顺序排序。忽略其他所有字符;
  • -f:排序时,将小写字母视为大写字母;
  • -i:排序时,处理040~176之间的ASCII字符,忽略其他所有字符;
  • -m:将几个排序好的文件进行合并;
  • -M:将前面3个字母按月份的缩写进行排序;
  • -n:按照数值大小进行排序;
  • -o outfile.txt:将排序后的结果存入outfile.txt;
  • -r:以相反的顺序进行排序;
  • -k:指定需要排序的列数(栏数);
  • -t 分隔符:指定排序时所用到的栏位分隔符;
  • + 起始栏位 - 结束栏位:以指定的栏位来排序,范围从起始栏位到结束栏位的前一栏位。(古老的用法)

sort常见用法

sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

[[email protected] text]# cat sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5

[[email protected] text]# sort sort.txt
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
eee:50:5.5

忽略相同行使用-u选项或者uniq:

[[email protected] text]# cat sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5

[[email protected] text]# sort -u sort.txt
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
或者
[[email protected] text]# uniq sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5

sort的-n、-r、-k、-t选项的使用:

[[email protected] text]# cat sort.txt
AAA:BB:CC
aaa:30:1.6
ccc:50:3.3
ddd:20:4.2
bbb:10:2.5
eee:40:5.4
eee:60:5.1

#将BB列按照数字从小到大顺序排列:
[[email protected] text]# sort -nk 2 -t: sort.txt
AAA:BB:CC
bbb:10:2.5
ddd:20:4.2
aaa:30:1.6
eee:40:5.4
ccc:50:3.3
eee:60:5.1

#将CC列数字从大到小顺序排列:
[[email protected] text]# sort -nrk 3 -t: sort.txt
eee:40:5.4
eee:60:5.1
ddd:20:4.2
ccc:50:3.3
bbb:10:2.5
aaa:30:1.6
AAA:BB:CC

# -n是按照数字大小排序,-r是以相反顺序,-k是指定需要爱排序的栏位,-t指定栏位分隔符为冒号

-k选项的具体语法格式:

-k选项的语法格式:

FStart.CStart Modifie,FEnd.CEnd Modifier
-------Start--------,-------End--------
 FStart.CStart 选项  ,  FEnd.CEnd 选项

这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。

从公司英文名称的第二个字母开始进行排序:

$ 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只能屈居第四了。

只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:

$ sort -t ‘ ‘ -k 1.2,1.2 -nrk 3,3 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个域开始到最后一个域位置的内容进行排序” 了。

uniq命令

uniq命令常用语报告或者消除文件中的重复内容,一般与sort命令结合使用。

命令选项

  • -c:在每行开头显示重复行出现的次数;
  • -d:仅显示重复的列;
  • -f 栏位:忽略指定的栏;
  • -s N:指定可以跳过前N个字符;
  • -w 字符位数:指定用于比较的最大字符数;
  • -u:仅显示出现一次的行列;

uniq用法

删除重复行:

uniq file.txt
sort file.txt | uniq
sort -u file.txt

只显示单一行:

uniq -u file.txt
sort file.txt | uniq -u

统计各行在文件中出现的次数:

sort file.txt | uniq -c

在文件中找出重复的行:

sort file.txt | uniq -d
时间: 2024-08-25 01:59:51

shell命令之sort的相关文章

6 shell命令之sort,uniq

sort用来排序,uniq用来去重,这两个命令经常被结合在一起使用.主要就是因为uniq去重的前提是文本必须排好序才可以. 当然字面上面理解,这两个命令的确是这样的功能.但是其实不然,他们还有相关的其它能力.一起来看看. sort [option] filename ...    对filename指定的文件进行排序相关的操作. option常用的包括: -b   忽略最前面的空格. -c   检查是否已经排序,结果通过$?来查看 -n   按数字进行排序 -d   字典排序. -M   月份排

Linux CentOS 7 shell中的特殊字符及与管道相关的命令(cut,sort,wc,uniq,tee,tr,split)

一. shell特殊符号cut命令 1.特殊符号 * :任意个任意字符 ? :任意单个字符# :注释\ :转义字符 | :管道符 2.几个和管道相关的命令 (1) cut cut 把文件分段 cat /etc/passwd cut -d: -f 3  /etc/passwd    cut -d: -f 3,6,5  /etc/passwd cut -d: -f 3-6  /etc/passwd cut -c 10 /etc/passwd   取第十个字符 cut -c 5-10 /etc/pas

Shell命令学习 之,sort,unique 文件简单排序去除重复记录

经常会碰到文件里有重复记录的场景,要么去除重复记录,要么统计下重复记录数,这些简单的功能可以通过shell命令里的sort,uniq组合实现, 比如文件a.txt记录如下 test,test1,test2 test test1 test2 test,test1,test2 abcd edfg abcd ddddd 去除重复行: sort a.txt |uniq abcd ddddd edfg test test,test1,test2 test1 test2 查找非重复行 [[email pro

使用sh库执行shell命令

python中执行shell命令 之前执行shell命令多是通过os.system(shell命令)的方式来执行,比较麻烦. 了解到sh是一个比subprocess好的库,能够执行shell命令 1.查看ip: [[email protected] myblog]# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.31.253.193 netmask 255.255.240.0 broadcas

37条常用Linux Shell命令组合

序号 任务 命令组合 1 删除0字节文件 find . -type f -size 0 -exec rm -rf {} \; find . type f -size 0 -delete 2 查看进程,按内存从大到小排列 ps -e -o “%C : %p : %z : %a”|sort -k5 -nr 3 按cpu利用率从大到小排列 ps -e -o “%C : %p : %z : %a”|sort -nr 4 打印说cache里的URL grep -r -a jpg /data/cache/*

shell命令---dirname

用途说明 dirname命令可以取给定路径的目录部分(strip non-directory suffix from file name).这个命令很少直接在shell命令行中使用,我一般把它用在shell脚本中,用于取得脚本文件所在目录,然后将当前目录切换过去.根据手册页上说的“Print  NAME  with  its  trailing  /component  removed; if NAME contains no /’s, output ‘.’ (meaning the curre

常用Linux Shell命令组合

序号 任务 命令组合 1 删除0字节文件 find . -type f -size 0 -exec rm -rf {} \;find . type f -size 0 -delete 2 查看进程,按内存从大到小排列 ps -e -o “%C : %p : %z : %a”|sort -k5 -nr 3 按cpu利用率从大到小排列 ps -e -o “%C : %p : %z : %a”|sort -nr 4 打印说cache里的URL grep -r -a jpg /data/cache/*

Linux的经典shell命令整理

Linux的经典shell命令整理 1.删除0字节文件find -type f -size 0 -exec rm -rf {} \; 2.查看进程按内存从大到小排列ps -e -o “%C : %p : %z : %a”|sort -k5 -nr 3.按cpu利用率从大到小排列ps -e -o “%C : %p : %z : %a”|sort -nr 4.打印说cache里的URLgrep -r -a jpg /data/cache/* | strings | grep “http:” | aw

shell命令技巧——文本去重并保持原有顺序

简单来说,这个技巧对应的是如下一种场景 假设有文本如下 cccc aaaa bbbb dddd bbbb cccc aaaa 现在需要对它进行去重处理,这个很简单,sort -u就可以搞定,但是如果我希望保持文本原有的顺序,比如这里有两个aaaa,我只是希望去掉第二个aaaa,而第一个aaaa在bbbb的前面,去重后仍旧要在它前面,所以我期望的输出结果是 cccc aaaa bbbb dddd 当然,这个问题本身并不难,用C++或python写起来都很容易,但所谓杀机焉用牛刀,能用shell命令