美文网首页
2.9 排序、唯一与重复

2.9 排序、唯一与重复

作者: 拙言_Coder | 来源:发表于2019-03-12 09:14 被阅读0次

    《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`作为定界符
    

    相关文章

      网友评论

          本文标题:2.9 排序、唯一与重复

          本文链接:https://www.haomeiwen.com/subject/rxawpqtx.html