Linux系统sort和uniq命令联合使用

Linux系统sort和uniq命令联合使用,第1张

给定两个文件 a.txt 和 b.txt ,每行是一个记录(假设没有重复),要求输出两集合的交集、并集、差集,输出的结果只包括唯一项。

交集定义为同时出现在两个文件中的记录项;

并集定义为出现在任何一个文件中的记录项;

差集( A-B )定义为出现在A中而且不出现在B中的记录;

对称差集定义为只出现在一个文件中的记录;

假设 a.txt 包括 a, c, b 三行。假设 b.txt 包括 d, e, c, b 四行。

交集 ,把两个文件放到一起排序,只输出次数多于一次的项:

$ sort a.txt b.txt | uniq -d

并集 ,把两个文件放到一起排序,重复的项只算一次:

$ sort a.txt b.txt | uniq

差集(A-B) ,把B的元素重复2份和A的元素放到一起排序,只输出出现一次的项:

$ sort a.txt b.txt b.txt | uniq -u

对称差 ,把两个文件放到一起排序,只输出出现一次的项:

$ sort a.txt b.txt | uniq -u

指定分隔符(-t)及基于哪一列(-k)、基于数值(-n) 、逆序(-r)进行排序

#排序之后删除了重复行,同时在行首位置输出该行重复的次数:

执行命令:sort testfile | uniq -c ,输出结果如下

#仅显示存在重复的行,并在行首显示该行重复的次数:

执行命令:sort testfile | uniq -dc,输出结果如下

#仅显示没有重复的行:

执行命令:sort testfile | uniq -u,输出结果如下

ref: Linux diff --比较两个文件并输出不同之处 - 老莫小小朋友 - CSDN博客

两个文件必须是排序和唯一(sorted and unique)

默认输出为三列,第一列为是A-B,第二列B-A,第三列为A交B

aaa.txt的差集 -2 -3 参数

bbb.txt的差集 -1 -3 参数

ref: 如何求两个文件的交集、并集和差集?------sort和uniq闪亮登场 - stpeace的专栏 - CSDN博客

交集:

并集:

差集:

#语法

127.0.0.1:6379>set key value [EX seconds] [PX milliseconds] [NX|XX]

  设置  键  值    生存时间(秒)  生存时间(毫秒)  如果不存在|如果存在

#添加key

127.0.0.1:6379>set k4 v4

OK

#添加多个key

127.0.0.1:6379>mset k5 v5 k6 v6 k7 v7 k8 v8

OK

#先查看再添加

127.0.0.1:6379>GETSET niulei sui

"cjdsb"

127.0.0.1:6379>get niulei

"sui"

#添加key同时设置生存时间

127.0.0.1:6379>set qiudao dsb ex 10

OK

#计数器增加值

127.0.0.1:6379>set good 1

OK

127.0.0.1:6379>get good

"1"

127.0.0.1:6379>INCR good

(integer) 2

127.0.0.1:6379>INCR good

(integer) 3

#计数器减少值

127.0.0.1:6379>DECR good

(integer) 2

127.0.0.1:6379>DECR good

(integer) 1

127.0.0.1:6379>DECR good

(integer) 0

#计数器增加指定值

127.0.0.1:6379>INCRBY good 100

(integer) 100

127.0.0.1:6379>INCRBY good 100

(integer) 200

127.0.0.1:6379>INCRBY good 100

(integer) 300

127.0.0.1:6379>INCRBY good 100

(integer) 400

127.0.0.1:6379>INCRBY good 100

(integer) 500

127.0.0.1:6379>get good

"500"

#计数器减少指定值

127.0.0.1:6379>DECRBY good 100

(integer) 400

127.0.0.1:6379>DECRBY good 100

(integer) 300

127.0.0.1:6379>DECRBY good 100

(integer) 200

127.0.0.1:6379>DECRBY good 100

(integer) 100

127.0.0.1:6379>get good

"100"

#计数器增加指定小数

127.0.0.1:6379>set good 8

OK

127.0.0.1:6379>get good

"8"

127.0.0.1:6379>INCRBYFLOAT good 0.1

"8.1"

127.0.0.1:6379>INCRBYFLOAT good 0.1

"8.2"

127.0.0.1:6379>INCRBYFLOAT good 0.1

"8.3"

127.0.0.1:6379>INCRBYFLOAT good 0.1

"8.4"

#计数器减少指定小数

127.0.0.1:6379>INCRBYFLOAT good -0.1

"8.3"

127.0.0.1:6379>INCRBYFLOAT good -0.1

"8.2"

127.0.0.1:6379>INCRBYFLOAT good -0.1

"8.1"

127.0.0.1:6379>INCRBYFLOAT good -0.1

"8"

#查看key

127.0.0.1:6379>get k1

"qwrwjgefdlksdfjlbasklgfns"

#查看数据长度

127.0.0.1:6379>TYPE k1

string

127.0.0.1:6379>STRLEN k1

(integer) 25

#查看指定位置的数据

127.0.0.1:6379>GETRANGE k1 0 3

"qwrw"

127.0.0.1:6379>GETRANGE k1 0 0

"q"

#查看多个key的值

127.0.0.1:6379>mget k1 k2 k3 k4

1) "qwrwjgefdlksdfjlbasklgfns"

2) "v2"

3) "v3"

4) "v4"

#删除key

127.0.0.1:6379>del k1

(integer) 1

#删除多个key

127.0.0.1:6379>del k2 k3 k4

(integer) 3

#修改数据

127.0.0.1:6379>get k4

"v4"

127.0.0.1:6379>set k4 v444444

OK

127.0.0.1:6379>get k4

"v444444"

#追加数据

127.0.0.1:6379>APPEND k4 append

(integer) 13

127.0.0.1:6379>get k4

"v444444append"

#修改指定位置的数据

127.0.0.1:6379>get k4

"v444444append"

127.0.0.1:6379>GETRANGE k4 4 4

"4"

127.0.0.1:6379>SETRANGE k4 4 0

(integer) 13

127.0.0.1:6379>get k4

"v444044append"

#语法

127.0.0.1:6379>hset key field value

  设置  键  列    值

#添加一个key的一个列

127.0.0.1:6379>hset teacher name qiudao

(integer) 1

#添加多个列

127.0.0.1:6379>hmset teacher id 1 age 78 sex nv

OK

#查看key的一列值

127.0.0.1:6379>hget teacher name

"qiudao"

127.0.0.1:6379>hget teacher sex

"nv"

127.0.0.1:6379>hget teacher age

"78"

#查看所有列的值

127.0.0.1:6379>hgetall teacher

1) "name"

2) "qiudao"

3) "id"

4) "1"

5) "age"

6) "78"

7) "sex"

8) "nv"

#添加列

127.0.0.1:6379>hset teacher money -100000

(integer) 1

127.0.0.1:6379>hgetall teacher

1) "name"

2) "qiudao"

3) "id"

4) "1"

5) "age"

6) "78"

7) "sex"

8) "nv"

9) "money"

10) "-100000"

#修改指定列的值

127.0.0.1:6379>HSET teacher name congtianqi

(integer) 0

127.0.0.1:6379>hgetall teacher

1) "name"

2) "congtianqi"

3) "id"

4) "1"

5) "age"

6) "78"

7) "sex"

8) "nv"

9) "money"

10) "-100000"

#使用incr

127.0.0.1:6379>HINCRBY teacher id 1

(integer) 2

127.0.0.1:6379>hgetall teacher

1) "name"

2) "congtianqi"

3) "id"

4) "2"

5) "age"

6) "78"

7) "sex"

8) "nv"

9) "money"

10) "-100000"

127.0.0.1:6379>HINCRBY teacher money 100000

(integer) 0

127.0.0.1:6379>hgetall teacher

1) "name"

2) "congtianqi"

3) "id"

4) "2"

5) "age"

6) "78"

7) "sex"

8) "nv"

9) "money"

10) "0"

#删除指定key的列

127.0.0.1:6379>HDEL teacher money sex

(integer) 2

127.0.0.1:6379>hgetall teacher

1) "name"

2) "congtianqi"

3) "id"

4) "2"

5) "age"

6) "78"

#删除整个key

127.0.0.1:6379>del teacher

(integer) 1

队列:先进先出

堆栈:先进后出

#添加一个数据(往左侧添加)

127.0.0.1:6379>LPUSH list qiudao

(integer) 1

#添加多个数据(往左侧添加)

127.0.0.1:6379>LPUSH list zengdao niulei lijianpeng

(integer) 4

127.0.0.1:6379>LPUSH list liuxinyu

(integer) 5

#添加多条数据(往右侧添加)

127.0.0.1:6379>RPUSH list congtianqi

(integer) 6

127.0.0.1:6379>RPUSH zhangxin guozongyuan geshaosong

(integer) 2

127.0.0.1:6379>RPUSH list zhangxin guozongyuan geshaosong

#查看列表所有数据

127.0.0.1:6379>LRANGE list 0 -1

1) "liuxinyu"

2) "lijianpeng"

3) "niulei"

4) "zengdao"

5) "qiudao"

6) "congtianqi"

7) "zhangxin"

8) "guozongyuan"

9) "geshaosong"

#查看列表类型数据量

127.0.0.1:6379>type list

list

127.0.0.1:6379>LLEN list

(integer) 9

#查看指定位置的数据

127.0.0.1:6379>LINDEX list 0

"liuxinyu"

127.0.0.1:6379>LINDEX list 1

"lijianpeng"

#读取队列数据,消费队列数据,消费一条少一条

1.使用lpush插入数据

127.0.0.1:6379>LPUSH list liukong

(integer) 10

2.查看数据

127.0.0.1:6379>LRANGE list 0 -1

1) "liukong"

2) "liuxinyu"

3) "lijianpeng"

4) "niulei"

5) "zengdao"

6) "qiudao"

7) "congtianqi"

8) "zhangxin"

9) "guozongyuan"

10) "geshaosong"

3.使用LPOP消费数据

127.0.0.1:6379>LPOP list

"liukong"

127.0.0.1:6379>LPOP list

"liuxinyu"

4.再次查看数据

127.0.0.1:6379>LRANGE list 0 -1

1) "lijianpeng"

2) "niulei"

3) "zengdao"

4) "qiudao"

5) "congtianqi"

6) "zhangxin"

7) "guozongyuan"

8) "geshaosong"

5.使用RPOP消费数据

127.0.0.1:6379>RPOP list

"geshaosong"

127.0.0.1:6379>RPOP list

"guozongyuan"

127.0.0.1:6379>RPOP list

"zhangxin"

6.再次查看数据

127.0.0.1:6379>LRANGE list 0 -1

1) "lijianpeng"

2) "niulei"

3) "zengdao"

4) "qiudao"

5) "congtianqi"

#总结:

1.当使用LPUSH插入数据,使用LPOP消费数据时,是堆栈

  当使用RPUSH插入数据,使用RPOP消费数据时,是堆栈

2.当使用LPUSH插入数据,使用RPOP消费数据时,是队列

  当使用RPUSH插入数据,使用LPOP消费数据时,是队列

#修改指定位置的数据

127.0.0.1:6379>LSET list 2 daijiadong

OK

127.0.0.1:6379>LRANGE list 0 -1

1) "lijianpeng"

2) "niulei"

3) "daijiadong"

4) "qiudao"

5) "congtianqi"

#将数据插入到列表指定位置

127.0.0.1:6379>LINSERT list after qiudao banzhang

(integer) 6

127.0.0.1:6379>LRANGE list 0 -1

1) "lijianpeng"

2) "niulei"

3) "daijiadong"

4) "qiudao"

5) "banzhang"

6) "congtianqi"

#将列表数据取出插入另一个列表

127.0.0.1:6379>RPOPLPUSH list list

"congtianqi"

127.0.0.1:6379>LRANGE list 0 -1

1) "congtianqi"

2) "lijianpeng"

3) "niulei"

4) "daijiadong"

5) "qiudao"

6) "banzhang"

127.0.0.1:6379>

#删除key

127.0.0.1:6379>DEL list

#删除指定数量的值(当数量不够时,删除仅有的值)

127.0.0.1:6379>LRANGE list 0 -1

1) "congtianqi"

2) "lijianpeng"

3) "niulei"

4) "daijiadong"

5) "qiudao"

6) "banzhang"

127.0.0.1:6379>LREM list 2 congtianqi

(integer) 1

127.0.0.1:6379>LRANGE list 0 -1

1) "lijianpeng"

2) "niulei"

3) "daijiadong"

4) "qiudao"

5) "banzhang"

#从头开始,索引为0,1,2的3个元素,其余全部删除改(反向删除)

127.0.0.1:6379>ltrim list 0 2

OK

127.0.0.1:6379>LRANGE list 0 -1

1) "lijianpeng"

2) "niulei"

3) "daijiadong"

127.0.0.1:6379>

在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等 *** 作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合 *** 作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

#添加两个集合(集合中设置一样的值没有效果)

127.0.0.1:6379>sadd set1 1 2 3 5 7

(integer) 5

127.0.0.1:6379>sadd set2 1 3 5 8 9

(integer) 5

#查看集合的数据

127.0.0.1:6379>SMEMBERS set1

1) "1"

2) "2"

3) "3"

4) "5"

5) "7"

127.0.0.1:6379>SMEMBERS set2

1) "1"

2) "3"

3) "5"

4) "8"

5) "9"

#查看集合中是否有某个值

127.0.0.1:6379>SISMEMBER set1 1

(integer) 1

127.0.0.1:6379>SISMEMBER set1 0

(integer) 0

#查看集合中的数据量

127.0.0.1:6379>SCARD set1

(integer) 5

#获取集合中随机值

127.0.0.1:6379>SRANDMEMBER set1 1

1) "2"

#取集合的交集

127.0.0.1:6379>SINTER set1 set2

1) "1"

2) "3"

3) "5"

#取集合的并集

127.0.0.1:6379>SUNION set1 set 2

1) "1"

2) "2"

3) "3"

4) "5"

5) "7"

#对比集合(取出前者有而后者没有的值)

127.0.0.1:6379>SDIFF set1 set2

1) "2"

2) "7"

127.0.0.1:6379>SDIFF set2 set1

1) "8"

2) "9"

#移动集合中的值到另一个集合

127.0.0.1:6379>SMOVE set1 set2 2

(integer) 1

127.0.0.1:6379>SMEMBERS set1

1) "1"

2) "3"

3) "5"

4) "7"

127.0.0.1:6379>SMEMBERS set2

1) "1"

2) "2"

3) "3"

4) "5"

5) "8"

6) "9"

#尾部数据查询,查询到即删除

127.0.0.1:6379>SPOP set1

"7"

127.0.0.1:6379>SPOP set1 2

1) "5"

2) "3"

127.0.0.1:6379>SMEMBERS set1

1) "1"

#删除指定值,若值不存在则只删除有的值

127.0.0.1:6379>SREM set2 1 2 3 5

(integer) 4

127.0.0.1:6379>SMEMBERS set2

1) "8"

2) "9"

应用场景:

排行榜应用,取TOP N *** 作

这个需求与上面需求的不同之处在于,前面 *** 作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

#添加一个数据

127.0.0.1:6379>ZADD linux9 90 banzhang 80 shengwei 50 jiwei 20 tiwei 100 xuewei

(integer) 5

#查看排序后数据

127.0.0.1:6379>ZRANGE linux9 0 -1

1) "tiwei"

2) "jiwei"

3) "shengwei"

4) "banzhang"

5) "xuewei"

#查看排序及排序依据

127.0.0.1:6379>ZRANGE linux9 0 -1 WITHSCORES

1) "tiwei"

2) "20"

3) "jiwei"

4) "50"

5) "shengwei"

6) "80"

7) "banzhang"

8) "90"

9) "xuewei"

10) "100"

#查看排序及排序依据(倒叙)

127.0.0.1:6379>ZREVRANGE linux9 0 -1 WITHSCORES

1) "xuewei"

2) "100"

3) "banzhang"

4) "90"

5) "shengwei"

6) "80"

7) "jiwei"

8) "50"

9) "tiwei"

10) "20"

#查看指定成员的分数

127.0.0.1:6379>ZSCORE linux9 xuewei

"100"

#查看成员的数量

127.0.0.1:6379>ZCARD linux9

(integer) 5

#查看符合条件范围的成员

127.0.0.1:6379>ZCOUNT linux9 50 100

(integer) 4

127.0.0.1:6379>ZRANGEBYSCORE linux9 50 100

1) "jiwei"

2) "shengwei"

3) "banzhang"

4) "xuewei"

127.0.0.1:6379>ZRANGEBYSCORE linux9 50 100 WITHSCORES

1) "jiwei"

2) "50"

3) "shengwei"

4) "80"

5) "banzhang"

6) "90"

7) "xuewei"

8) "100"

#修改数据的值,排行榜顺序也会改变

127.0.0.1:6379>ZINCRBY linux9 100 tiwei

"120"

127.0.0.1:6379>ZREVRANGE linux9 0 -1 WITHSCORES

1) "tiwei"

2) "120"

3) "xuewei"

4) "100"

5) "banzhang"

6) "90"

7) "shengwei"

8) "80"

9) "jiwei"

10) "50"

#删除集合中指定成员

127.0.0.1:6379>zrem linux9 shengwei

(integer) 1

127.0.0.1:6379>ZREVRANGE linux9 0 -1 WITHSCORES

1) "tiwei"

2) "120"

3) "xuewei"

4) "100"

5) "banzhang"

6) "90"

7) "jiwei"

8) "50"

#删除整个key

127.0.0.1:6379>del linux9

(integer) 1


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7280495.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-03
下一篇2023-04-03

发表评论

登录后才能评论

评论列表(0条)

    保存