Linux下文本的去重&排序

Linux下文本的去重&排序平时工作中 我们会遇到对文本进行去重 排序等操作处理的需求 本文介绍了 Linux 系统中常用的排序去重命令 sort uniq 和 awk 1 文本排序 linux 下文本排序一般使用 sort 命令 既可以按行排序 也可以按照分隔字段排序 本文使用文件 t

欢迎大家来到IT世界,在知识的湖畔探索吧!

平时工作中,我们会遇到对文本进行去重、排序等操作处理的需求,本文介绍了Linux系统中常用的排序去重命令sort、uniq和awk。

1、文本排序

linux下文本排序一般使用sort命令,既可以按行排序,也可以按照分隔字段排序。本文使用文件test.txt内容如下:

1 b 3 a 5 d 3 d 4 c 2 e

10 g

1 a 3 d 2 e

共10行文本,每行2列。

1.1 按行排序

sort命令按行排序,是按照字符的ascii码顺序进行排序

[test@localhost ~]$ sort test.txt 10 g 1 a 1 b 2 e 2 e 3 a 3 d 3 d 4 c 5 d [test@localhost ~]$ sort -r test.txt 5 d 4 c 3 d 3 d 3 a 2 e 2 e 1 b 1 a 10 g

欢迎大家来到IT世界,在知识的湖畔探索吧!

-r表示降序排序。

1.2 按列排序

sort命令按列排序,使用-t设置字段分隔符

欢迎大家来到IT世界,在知识的湖畔探索吧![test@localhost ~]$ sort -t' ' -k1 test.txt 10 g 1 a 1 b 2 e 2 e 3 a 3 d 3 d 4 c 5 d [test@localhost ~]$ sort -t' ' -k1n test.txt 1 a 1 b 2 e 2 e 3 a 3 d 3 d 4 c 5 d 10 g [test@localhost ~]$ sort -t' ' -k1nr test.txt 10 g 5 d 4 c 3 a 3 d 3 d 2 e 2 e 1 a 1 b [test@localhost ~]$ sort -t' ' -k2r test.txt 10 g 2 e 2 e 3 d 3 d 5 d 4 c 1 b 1 a 3 a

命令解析:-k1nr,其中k1表示第1列,n表示按照数字排序,r表示降序排序。

2、文本行去重

linux下文本按行去重,一般使用uniq命令。

例如文件test2.txt内容如下:

1 b 3 a 5 d 5 d 4 c 2 e

4 c

使用uniq命令去重,如下:

[test@localhost ~]$ uniq test2.txt 1 b 3 a 5 d 4 c 2 e 4 c

从去重结果可以看出uniq命令只能把相邻的重复行去掉。故使用uniq命令最好先进行sort排序,这样才能去除所有重复行。

欢迎大家来到IT世界,在知识的湖畔探索吧![test@localhost ~]$ sort test2.txt | uniq 1 b 2 e 3 a 4 c 5 d

从上面结果可以看出排序后,再使用uniq可以进行去重操作。

如果不想改变文本行的顺序情况下进行去重,可以结合awk命令,如下

[test@localhost ~]$ cat test2.txt | awk '{  if(lines[$0]==0)  {    lines[$0]=1;    print($0);  } }' 1 b 3 a 5 d 4 c 2 e

命令解析:

awk是linux下可编程的文本处理命令。lines是定义的数组,$0表示整行文本。如果没有赋值,则lines[$0]值为0,否则赋值为1,这样能去重。print($0)表示输出。

使用awk命令去重,还有简化命令,如下:

欢迎大家来到IT世界,在知识的湖畔探索吧![test@localhost ~]$ cat test2.txt | awk '!lines[$0]++' 1 b 3 a 5 d 4 c 2 e

命令含义同上面awk完整版本。awk的程序指令由模式和操作组成,即Pattern { Action }的形式,如果省略Action,则默认执行 print($0) 的操作。实现去除重复功能的就是这里的Pattern:!lines[$0]++。在awk中,对于未初始化的数组变量,在进行数值运算的时候,会赋予初值0,因此lines[$0]=0。++运算符的特性是先取值,后加1,因此Pattern等价于!0而0为假,!为取反。因此整个Pattern最后的结果为1,相当于if(1),Pattern匹配成功,输出当前记录。

3、文本字段去重

linux下文本按字段去重,无法使用uniq命令,可以使用awk命令。对于文件test.txt内容如下:

1 b 3 a 5 d 3 d 4 c 2 e

10 g

1 a 3 f

2 e

共10行文本,每行2列。

按第1列去重,命令如下:

[test@localhost ~]$ awk -F' ' '!fields[$1]++' test.txt 1 b 3 a 5 d 4 c 2 e 10 g

命令解析:-F’ ‘表示字段使用空格’ ‘分割。其他命令原理同前面awk按行去重。

按第2列去重,命令如下:

欢迎大家来到IT世界,在知识的湖畔探索吧![test@localhost ~]$ awk -F' ' '!fields[$2]++' test.txt 1 b 3 a 5 d 4 c 2 e 10 g 3 f

上述命令中$1和$2表示分割后的第1个字段和第2个字段内容。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/99235.html

(0)
上一篇 1天前
下一篇 1天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信