zoukankan      html  css  js  c++  java
  • 2.9排序、唯一与重复

    sort命令能够帮助我们队文本文件和stdin进行排序操作。它通常会配合其他命令来生成所需要的输出。uniq是一个经常与sort一同使用的命令。它的作用是从文本或stdin中提取唯一(或重复)的行。

    1、sort命令既可以从特定的文件,也可以从stdin中获取输入,并将输出写入stdout。uniq和sort的工作方式一样。

    a、可以按照下面的方式对一组文件进行排序:

    $sort file1.txt file2.txt >sorted.txt

    或是

    $ sort file1.txt file2.txt -o sorted.txt

    b、按照数字顺序进行排序:

    $ sort -n file.txt

    c、按照逆序进行排序:

    $ sort -r file.txt

    d、按照月份进行排序

    $sort -M months.txt

    e、合并两个已排序过的文件;

    $sort -m sorted1 sorted2

    f、找出已排序文件中不重复的行:

    $sort file1.txt file2.txt | uniq

    g、检查文件是否已经排序过

    #!/bin/bash

    #功能描述:排序

    sort -C filename;

    if [ $? -eq 0 ] ; then

      echo Sorted;

    else

      echo Unsorted;

    fi

    将filename替换成你需要进行检查的文件名,然后运行该脚本。

    2、工作原理

    sort命令包含大量的选项,能够对文件数据进行各种排序。如果使用uniq命令,那sort更是必不可少,因为前者要求输入数据必须经过排序。

    要检查文件是否排序过,可以采用以下方法:如果文件已经排序,sort会返回为0的退出码($?),否则返回非0.

    3、补充内容

    a、依据键或列进行排序

    按列将下面的文本排序

    $ cat data.txt

    1 mac  2000

    2 winxp 4000

    3 bsd   1000

    4 linux  1000

    有多重方法对这段文本进行排序。目前它是按照序号第一列来排序的。也可以依据第二列和第三列来排序。

    -k指定了排序应该按照哪一个键(key)来进行。键指的是列号,而列号就是执行排序时的依据。-r 告诉sort命令按照逆序进行排序。如

    eg;依据第一列,以逆序形式排序

    $ sort -nrk 1 data.txt

    其中,-nr表明按照数字,采用逆序形式排序

    依据第2列进行排序

    $sort -k 2 data.txt

    注意:一定要留意用于按数字顺序进行排序的选项-n。sort命令对于字母表排序和数字排序有不同的处理方式。因此,如果要采用数字顺序排序,就应该明确地给出-n选项。

    通常在默认情况下,键就是文本文件中的列。列与列之间用空格分隔。

    但有时候,我们需要将特定范围内的一组字符(如:key1=character4-character8)作为键。在这种情况下,必须明确地将键指定为某个范围内的字符,这个范围可以用键起止的字符位置来表明。如:

    $cat data.txt

    1010hellothis

    2189ababbba

    7464dfddfdfd

    $sort -nk 2,3 data.txt

    把醒目的字符作为数值键。为了提取这个键,用字符在行内的起止位置作为键的书写格式(在上面的例子中,起止位置是2和3).

    用第一个字符作为键:

    $sort -nk 1,1 data.txt

    为了使sort的输出与以作为终止符的xargs命令相兼容,采用下面的命令:

    $sort -z data.txt | xargs -0

    #终止符用来保证xargs命令的使用安全

    如果要忽略掉文本中的空格,以字典序进行排序,可以使用:

    $sort -bd unsorted.txt

    其中,选项-b用于忽略文件中的前导空白行,选项-d用于指明以字典序进行排序。

    2、uniq

    uniq命令通过消除重复内容,从给定输入中(stdin或命令行参数文件)找出唯一的行。它也可以用来找出输入中出现的重复行。

    uniq只能作用于排过序的数据输入,因此,uniq要么使用管道,要么将排过序的文件作为输入,与sort命令结合使用。

    eg:

    $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

    要统计各行在文件中出现的次数,使用

    $sort unsorted.txt |uniq -c

    1 bash

    1 foss

    2 hack

    找出文件中重复的行

    $sort unsorted.txt |uniq -d

    hack

    可以结合-s 和-w来指定键:

    -s指定可以跳过前n个字符;

    -w指定用于比较的最大字符数。

  • 相关阅读:
    UVa 10118 记忆化搜索 Free Candies
    CodeForces 568B DP Symmetric and Transitive
    UVa 11695 树的直径 Flight Planning
    UVa 10934 DP Dropping water balloons
    CodeForces 543D 树形DP Road Improvement
    CodeForces 570E DP Pig and Palindromes
    HDU 5396 区间DP 数学 Expression
    HDU 5402 模拟 构造 Travelling Salesman Problem
    HDU 5399 数学 Too Simple
    CodeForces 567F DP Mausoleum
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6169269.html
Copyright © 2011-2022 走看看