排序sort与去重uniq
程序员文章站
2024-02-24 10:37:40
...
1.sort
排序命令,将指定文件或者输入的内容排序后输出到标准输出
格式
sort option [file or input]
选项说明
常规选项:
-b, --ignore-leading-blanks 忽略前导空格
-d, --dictionary-order 仅考虑空格和字母数字字符
-f, --ignore-case 忽略大小写,最终以大写比较
-g, --general-numeric-sort 以数字方式进行比较(文件中读取出来的都是字符串)
-i, --ignore-nonprinting 仅考虑可打印字符
-h, --human-numeric-sort 比较人类可读的数字,人性化阅读比较 (e.g., 2K 1G)
-n, --numeric-sort 根据数值字符串比较,如 ”123“
-R, --random-sort 随机排序,对相同的进行分组
--random-source=FILE 从文件获取随机字节
-r, --reverse 逆序排序
--sort=WORD 根据WORD排序:
general-numeric -g, human-numeric -h, month -M,
numeric -n, random -R, version -V
-V, --version-sort natural sort of (version) numbers within text
其它选项:
--batch-size=NMERGE merge at most NMERGE inputs at once;
for more use temp files
-c, --check, --check=diagnose-first check for sorted input; do not sort
-C, --check=quiet, --check=silent like -c, but do not report first bad line
--compress-program=PROG compress temporaries with PROG;
decompress them with PROG -d
--debug annotate the part of the line used to sort,
and warn about questionable usage to stderr
--files0-from=F read input from the files specified by
NUL-terminated names in file F;
If F is - then read names from standard input
-k, --key=KEYDEF 根据某一列排序
-m, --merge merge already sorted files; do not sort
-o, --output=FILE 将结果输出至文件
-s, --stable stabilize sort by disabling last-resort comparison
-S, --buffer-size=SIZE use SIZE for main memory buffer
-t, --field-separator=SEP 指定分隔符,默认为空格
-T, --temporary-directory=DIR use DIR for temporaries, not $TMPDIR or /tmp;
multiple options specify multiple directories
--parallel=N change the number of sorts run concurrently to N
-u, --unique 去重
-z, --zero-terminated 将换行符设置为 NUL
--help display this help and exit
--version 显示版本信息
常用方法
#对此结果进行排序
$ ps aux | tail
root 25306 0.0 0.0 0 0 ? S 13:50 0:00 [kworker/1:2]
root 25549 0.0 0.0 178148 2532 ? S 13:55 0:00 /usr/sbin/CROND -n
root 25550 0.0 0.0 178148 2532 ? S 13:55 0:00 /usr/sbin/CROND -n
60729213 25556 0.0 0.0 113116 1204 ? Ss 13:55 0:00 /bin/sh -c sleep 30; shell /home/60729213/1.txt /home/60729213/1.log
60729213 25559 0.0 0.0 107892 604 ? S 13:55 0:00 sleep 30
60729213 25562 0.0 0.0 113116 1208 ? Ss 13:55 0:00 /bin/sh -c sleep 40; shell /home/60729213/1.txt /home/60729213/1.log
60729213 25564 0.0 0.0 107892 604 ? S 13:55 0:00 sleep 40
66294790 25588 0.0 0.0 151052 1840 pts/16 R+ 13:55 0:00 ps aux
66294790 25589 0.0 0.0 107928 668 pts/16 S+ 13:55 0:00 tail
ck16061+ 28894 0.0 0.0 158544 2020 ? S Dec04 0:34 top
根据第6列排序后输出
# -t 指定分隔符 -k 指定哪一列
$ ps aux | tail | sort -k 6 -t " "
root 23456 0.0 0.0 0 0 ? S 13:20 0:00 [kworker/0:0]
root 23880 0.0 0.0 0 0 ? S 13:26 0:00 [kworker/1:0]
root 25306 0.0 0.0 0 0 ? S 13:50 0:00 [kworker/1:2]
66294790 25733 0.0 0.0 151052 1832 pts/16 R+ 13:57 0:00 ps aux
ck16061+ 28894 0.0 0.0 158544 2020 ? S Dec04 0:34 top
ck16641+ 23428 0.0 0.0 115380 2104 pts/9 Ss+ 13:20 0:00 -bash
sshd 25628 0.0 0.0 107464 2328 ? S 13:56 0:00 sshd: unknown [net]
root 25627 0.0 0.1 145040 4752 ? Ss 13:56 0:00 sshd: unknown [priv]
66294790 25734 0.0 0.0 107928 672 pts/16 S+ 13:57 0:00 tail
66294790 25735 0.0 0.0 118488 908 pts/16 S+ 13:57 0:00 sort -k 6
上面输出按第6列排序,但是我们可以看到,并没有按照数字大小来进行排序
这是因为读取到的值默认为字符串,字符串比较当前一个字符能区别出大小后,后面的就不会再比较了
这里需要加 -g或者-n 参数来转换成数值比较
$ ps aux | tail | sort -g -k 6
root 23456 0.0 0.0 0 0 ? S 13:20 0:00 [kworker/0:0]
root 23880 0.0 0.0 0 0 ? S 13:26 0:00 [kworker/1:0]
root 25306 0.0 0.0 0 0 ? S 13:50 0:00 [kworker/1:2]
66294790 25734 0.0 0.0 107928 672 pts/16 S+ 13:57 0:00 tail
66294790 25735 0.0 0.0 118488 908 pts/16 S+ 13:57 0:00 sort -k 6
66294790 25733 0.0 0.0 151052 1832 pts/16 R+ 13:57 0:00 ps aux
ck16061+ 28894 0.0 0.0 158544 2020 ? S Dec04 0:34 top
ck16641+ 23428 0.0 0.0 115380 2104 pts/9 Ss+ 13:20 0:00 -bash
sshd 25628 0.0 0.0 107464 2328 ? S 13:56 0:00 sshd: unknown [net]
root 25627 0.0 0.1 145040 4752 ? Ss 13:56 0:00 sshd: unknown [priv]
使用 -r 进行逆序排序
$ ps aux | tail | sort -g -k 6 -r
root 25627 0.0 0.1 145040 4752 ? Ss 13:56 0:00 sshd: unknown [priv]
sshd 25628 0.0 0.0 107464 2328 ? S 13:56 0:00 sshd: unknown [net]
ck16641+ 23428 0.0 0.0 115380 2104 pts/9 Ss+ 13:20 0:00 -bash
ck16061+ 28894 0.0 0.0 158544 2020 ? S Dec04 0:34 top
66294790 25733 0.0 0.0 151052 1832 pts/16 R+ 13:57 0:00 ps aux
66294790 25735 0.0 0.0 118488 908 pts/16 S+ 13:57 0:00 sort -k 6
66294790 25734 0.0 0.0 107928 672 pts/16 S+ 13:57 0:00 tail
root 25306 0.0 0.0 0 0 ? S 13:50 0:00 [kworker/1:2]
root 23880 0.0 0.0 0 0 ? S 13:26 0:00 [kworker/1:0]
root 23456 0.0 0.0 0 0 ? S 13:20 0:00 [kworker/0:0]
2.uniq
报告或者省略重复的行,即对输出进行按行去重
但是uniq只能检测到相邻的行,所以在去重之前需要先对数据进行排序
使用格式
$ uniq option file or input
$ cat uniqdemo.txt
a
b
a
b
b
c
d
d
d
d
选项
-c, --count 打印出重复出现了多少次
-d, --repeated 只打印重复的行
-D, --all-repeated[=METHOD] 打印出所有重复的元素,按组输出
-f, --skip-fields=N 不比较前N个字段
-i, --ignore-case 忽略差异
-s, --skip-chars=N 不比较前N个字符
-u, --unique 打印不重复的行
-z, --zero-terminated 以0结尾算一行,不以换行符为一行
-w, --check-chars=N 每行比较不超过N个字符
常见用法
对uniqdemo.txt进行去重
$ uniq -c uniqdemo.txt
1 a
1 b
1 a
2 b
1 c
4 d
排序后去重
$ sort uniqdemo.txt | uniq -c
2 a
3 b
1 c
4 d
只打印有重复的行
$ sort uniqdemo.txt | uniq -c -d
2 a
3 b
4 d
只打印不重复的行
$ sort uniqdemo.txt | uniq -c -u
1 c
上一篇: linux下删除某一时间段的文件
下一篇: 单服务器最大tcp连接数及调优汇总