linux shell进行文件去重

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添加行号是用来恢复原来数据的顺序。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值