欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

排序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 linux shell