2.9 排序、唯一与重复

《Linux Shell 脚本攻略(第 2 版)》读书笔记

sort命令既可以从特定的文件,也可以从 stdin 中获取输入,并将输出写入 stdout。

uniq的工作方式和sort一样。但要求输入的数据必须经过排序

基本用法

1. 对一组文件的内容进行排序

# 方法1
sort file1.txt file2.txt > sorted.txt

# 方法2
sort file1.txt file2.txt -o sorted.txt

# 方法3
sort file{1..2}.txt > sorted.txt

2. 按照数字顺序进行排序

sort -n file.txt

3 按照逆序进行排序

sort -r file.txt

4. 按照月份进行排序

sort -M file.txt

注意:对于 中文的月份(一月、二月、三月) 是如法进行正常排序的!

5. 合并两个已排序过的文件

sort -m sorted1 sorted2

注意:这里加上 -m 之后就不会对原文件 sorted1 sorted2 进行排序,而是只会对两个文件之间的值进行比较,从而起到提高效率的作用。

6. 对文件内容进行排序,并去除重复行

sort file1.txt file2.txt | uniq

7. 检查文件是否已经排序过

#!/bin/bash

sort -C filename
if [ $? -eq 0 ]; then
  echo Sorted
else
  echo Unsorted
fi

如果文件已经排序,sort会返回为 0 的退出码($?),否则返回非 0。

8. 将文件排过序之后再保存到原文件中

$ sort file.txt > file.txt
# 如果执行上面这条命令的话,会导致 file.txt 文件中的内容被清空
# 如果有这个需求的话,执行下面这条命令可以正常实现功能
$ sort file.txt -o file.txt

补充内容

1. 依据键或列进行排序

将下面的文本文件排序:

$ cat data.txt
1  mac    2000
2  winxp  4000
3  bsd    1000
# 依据第1列,以逆序形式排序
$ sort -nrk 1 data.txt
4  linux  1000
3  bsd    1000
2  winxp  4000
1  mac    2000
# -nr 表明按照数字,采用逆序形式排序

# 依据第2列进行排序
$ sort -k 2 data.txt
3  bsd    1000
4  linux  1000
1  mac    2000
2  winxp  4000

将特定范围内的一组字符作为键,进行排序

$ cat data2.txt
1010stweg
5749twtld
4569nzqin

# 将每行中从第2到第4个字符作为数字进行排序
$ sort -nk 2,4 data2.txt
1010stweg
4569nzqin
5749twtld

使 sort 的输出与以\0作为定界符 xargs 命令相兼容

$ sort -z data.txt | xargs -0
# 定界符 `\0` 用来保证 xargs 命令的使用安全

忽略文件中的前导空白字符

$ cat data3.txt
a
 c
  b

$ sort -bd data3.txt
a
  b
 c
  • -b 用于忽略文件中的前导空白
  • -d 用于指明以字典序列进行排列

2. uniq

消除重复内容

$ cat sorted.txt
bash
foss
hack
hack

$ uniq sorted.txt
bash
foss
hack

或者

sort unsorted.txt | uniq

只显示唯一的行(在输入文件中没有重复出现的行)

$ uniq -u sorted.txt
bash
foss

或者

sort unsorted.txt | uniq -u

统计各行在文件中出现的次数

$ uniq -c sorted.txt
   1 bash
   1 foss
   2 hack

找出文件中重复的行

$ uniq -d sorted.txt
hack

结合-s-w来指定键

  • -s指定可以跳过前n个字符
  • -w指定用于比较的最大字符数(此选项 OS X 系统中没有)
$ cat data.txt
u:01:gnu
d:04:linux
u:01:bash
u:01:hack

$ sort data.txt | uniq -s 2 -w 2
d:04:linux
u:01:bash

删除文件中列出的所有文件

$ uniq -z file.txt | xargs -0 rm
# 这里要注意的还是 xargs 的输入必须使用`\0`作为定界符
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 6,001评论 0 9
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,725评论 0 5
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,230评论 0 0
  • 秘书为什么要经受得住透支体力 一般人认为秘书工作就是脑力劳动、秀才活儿,坐在办公室里看看文件、写写材料、打打电话、...
    秘书有心得阅读 938评论 0 2
  • 关于爱情 大学时期的闺蜜过来上海出差,聊聊陈年往事,也感叹一下时光飞逝。闺蜜说:你不说话的时候特别迷人!我翻了个白...
    牧牧牧牧牧小笛阅读 228评论 0 0

友情链接更多精彩内容