今天工作使用到对一个超过100万行的文件,去重统计某一列有多少个。使用命令如下1
cat xx.csv | sort -t ',' -k 1,1 -u | wc -l
其中-t
表示每行的分隔符是什么,-k
表示统计第几列到第几列,-u
表示去重
wc -l
统计文件有多少行
sort
和 uniq
这两个命令还有挺多东西需要学习一下的,后面整理一下。
2019-08-26
在工作的场景中,我们经常针对大文本做一些统计,比如说前文的去重统计某一列的id个数。使用 Python 统计固然可以,但是我们也有更方便的办法:sort
and uniq
。
我们先创建一个 demo.txt
的文件,来做实验:1
2
3
4
5
6
7cat demo.txt
1,2,3
2,3,3
2,3,4
2,3,3
5,5,2
4,2,3
sort
: 为排序而生
sort
基本用法:
1 | cat <filename> | sort |
两个命令都可以, sort
会逐行读取内容,然后按照 ASCII
编码的顺序,升序排列文件的行,最后输出到标准输出,其中 sort
可以连续读入多个文件,然后合在一起排序。
1 | sort demo.txt |
sort
常用选项:
- -o: 定向输出文件
- -r: 倒叙排列
- -n: 排序数字时使用
- -u: 去除重复行
- -t: 指定分隔符(通常与 -k 联用)
- -k: 指定用于排序的列号
- -f: 忽略大小写
- -M: 能够排序月份
- -b: 忽略行首空白
- -u: 对有相同键的列去重
uniq
治重复专用
uniq
的作用可以描述为:针对相邻的重复行,进行相应的动作。(大哥讲太好,忍不住复制了过来)
这句话中,有两个地方需要注意。首先,针对的是相邻的重复行。因此,uniq 对于不相邻的重复行是不起作用的。其次,进行相应的动作。这意味着,uniq 可以做的事情很多,不止一样。
uniq
默认是对相邻的重复行,进行去重的操作:
1 | cat demo.txt | sort | uniq |
上面命令也就很简单了:把 demo.txt
的文件按照升序排列,然后去除重复的行,最后输出到标准输出(屏幕)
当然,我们也可以给 uniq
加上不同的参数,来解锁不同的姿势。
1 |
|
使用sort
和 uniq
准备另一个集合 demo_cp.txt
1 | cat demo_cp.txt |
求交集
我们想要知道两个文件里面都出现了的元素,那么就是两个文件重复的行,easy。1
sort <file1> <file2> | uniq -d # 交集
实战一下:
1 | sort demo.txt demo_cp.txt | uniq -d |
求并集
前文已经演示过了,easy
求差集
也就是重合过的不要呗,那就是 uniq -u
统计只出现过一次的行
1 | sort <file1> <file2> | uniq -u # 差集 |
参考
感恩大佬的文章最佳搭档:利用 sort 和 uniq 做集合运算