Linux--sort&uniq

今天工作使用到对一个超过100万行的文件,去重统计某一列有多少个。使用命令如下

1
cat xx.csv | sort -t ',' -k 1,1 -u | wc -l

其中-t表示每行的分隔符是什么,-k表示统计第几列到第几列,-u表示去重

wc -l 统计文件有多少行

sortuniq 这两个命令还有挺多东西需要学习一下的,后面整理一下。


2019-08-26

在工作的场景中,我们经常针对大文本做一些统计,比如说前文的去重统计某一列的id个数。使用 Python 统计固然可以,但是我们也有更方便的办法:sort and uniq

我们先创建一个 demo.txt 的文件,来做实验:

1
2
3
4
5
6
7
$cat demo.txt
1,2,3
2,3,3
2,3,4
2,3,3
5,5,2
4,2,3

sort : 为排序而生

sort 基本用法:

1
2
cat <filename> | sort
sort <file1> [<file2> [<file3> [...]]]

两个命令都可以, sort 会逐行读取内容,然后按照 ASCII 编码的顺序,升序排列文件的行,最后输出到标准输出,其中 sort 可以连续读入多个文件,然后合在一起排序。

1
2
3
4
5
6
7
$sort  demo.txt
1,2,3
2,3,3
2,3,3
2,3,4
4,2,3
5,5,2

sort 常用选项:

  • -o: 定向输出文件
  • -r: 倒叙排列
  • -n: 排序数字时使用
  • -u: 去除重复行
  • -t: 指定分隔符(通常与 -k 联用)
  • -k: 指定用于排序的列号
  • -f: 忽略大小写
  • -M: 能够排序月份
  • -b: 忽略行首空白
  • -u: 对有相同键的列去重

uniq 治重复专用

uniq 的作用可以描述为:针对相邻的重复行,进行相应的动作。(大哥讲太好,忍不住复制了过来)

这句话中,有两个地方需要注意。首先,针对的是相邻的重复行。因此,uniq 对于不相邻的重复行是不起作用的。其次,进行相应的动作。这意味着,uniq 可以做的事情很多,不止一样。

uniq 默认是对相邻的重复行,进行去重的操作:

1
2
3
4
5
6
7
$cat demo.txt | sort  | uniq
1,2,3
2,3,3
2,3,4
4,2,3
5,5,2
# 2,3,3进行了去重

上面命令也就很简单了:把 demo.txt 的文件按照升序排列,然后去除重复的行,最后输出到标准输出(屏幕)

当然,我们也可以给 uniq 加上不同的参数,来解锁不同的姿势。

1
2
3
4
5

cat <filename> | sort | uniq -d # 只显示重复的行,每行只显示一次
cat <filename> | sort | uniq -i # 忽略大小写
cat <filename> | sort | uniq -u # 只显示只出现一次的行
cat <filename> | sort | uniq -c # 统计每行重复的次数

使用sortuniq

准备另一个集合 demo_cp.txt

1
2
3
4
5
6
$cat demo_cp.txt
1,2,3
2,3,3
2,3,4
2,3,3
6,1,2
求交集

我们想要知道两个文件里面都出现了的元素,那么就是两个文件重复的行,easy。

1
$sort <file1> <file2> | uniq -d # 交集

实战一下:

1
2
3
4
$sort demo.txt demo_cp.txt | uniq -d
1,2,3
2,3,3
2,3,4
求并集

前文已经演示过了,easy

求差集

也就是重合过的不要呗,那就是 uniq -u 统计只出现过一次的行

1
$sort <file1> <file2> | uniq -u # 差集

参考

感恩大佬的文章最佳搭档:利用 sort 和 uniq 做集合运算