about云推荐的文章,有时候是可以看看,更好的是要慢慢去品味。
http://www.aboutyun.com/thread-14552-1-1.html 连接中一段文章,我们来分析下。
二、shell进行文件去重
aaa.txt
111
222
333
444
333
222
555
代码:
cat -n aaa.txt | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2-
代码解释:
cat -n in.txt : 输出文本,并在前面加上行号,以\t分隔
sort -k2,2 -k1,1n : 对输入内容排序,primary key是第二个字段,second key是第一个字段并且按数字大小排序
uniq -f1 : 忽略第一列,对文本进行去重,但输出时会包含第一列
sort -k1,1n : 对输入内容排序,key是第一个字段并按数字大小排序
cut -f2- : 输出第2列及之后的内容,默认分隔符为\t
sort 那块虽然解释了一大堆,但是还是有模糊的地方。所以做了如下测试
[root@localhost ~]# cat bbb.txt
a 111
bb 22
ccc 3
[root@localhost ~]# sort bbb.txt -k 2n -- -k 2表示对第2列排序,n表示按数字顺序
ccc 3
bb 22
a 111
[root@localhost ~]# sort bbb.txt -k 2.1n -- 2.1表示第2列的第一个字母开始至最后,所以和上一列返回结果一样
ccc 3
bb 22
a 111
[root@localhost ~]# sort bbb.txt -k 2.1,2.1n -- -k 2.1,2.1n表示第2列第一个字母开始至第2列第一个字母结束
a 111
bb 22
ccc 3
cut也测试了一下
[root@localhost ~]# cat bbb.txt
a 111
bb 22
ccc 3
[root@localhost ~]# cut -d ' ' -f1 bbb.txt --显示第一个区域
a
bb
ccc
[root@localhost ~]# cut -d ' ' -f2 bbb.txt --显示第二个区域
111
22
3
[root@localhost ~]# cut -d ' ' -f1- bbb.txt --显示第一个区域到最后
a 111
bb 22
ccc 3
[root@localhost ~]# cut -d ' ' -f2- bbb.txt --显示第二个区域到最后
111
22
3
[root@localhost ~]# cut -d ' ' -f1-2 bbb.txt --显示第一、二个区域
a 111
bb 22
ccc 3
程序貌似是完整看明白了,但是题目标注的仅仅是去重复,何必兜一大圈?
原来uniq只能去除连续的重复行,同时cat添加行号是用来恢复原来数据的顺序。