代码之家  ›  专栏  ›  技术社区  ›  Swimming bird

数字相等时按数字排序,但不按字母顺序排序

  •  1
  • Swimming bird  · 技术社区  · 8 年前

    我有一个这样的文件:

    A 0.77
    C 0.98
    B 0.77
    Z 0.77
    G 0.65
    

    我想按降序对文件进行数字排序。我用了这个代码:

    sort -gr -k2,2 file.txt
    

    我得到这个:

    C 0.98 
    Z 0.77
    B 0.77
    A 0.77
    G 0.65
    

    在我的真实文件中,我有几列相同的数字,它们是按字母顺序排列的。我想要的是数字排序,而不是字母排序当数字相等时,我想要得到那些未按字母排序的列:

    C 0.98
    B 0.77  
    Z 0.77
    A 0.77
    G 0.65
    

    但任何随机顺序都可以。

    2 回复  |  直到 8 年前
        1
  •  2
  •   anubhava    8 年前

    你可以用这个 sort 以下内容:

    sort -k2rn -k1R file
    

    C 0.98
    B 0.77
    Z 0.77
    A 0.77
    G 0.65
    

    使用了两种排序选项:

    • -k2rn :第一个排序键是第2列;数字,反向
    • -k1R :第二个排序键是列1; 随机的
        2
  •  1
  •   James Brown    8 年前

    gnu awk中保留第一个字段顺序的一个(随机输入,同等随机输出):

    $ awk ' {
        a[$2]=a[$2] (a[$2]==""?"":FS) $1       # append $1 values to hash, indexed on $1
    }
    END {
        PROCINFO["sorted_in"]="@ind_num_desc"  # set for traverse order for index order...
        for(i in a) {                          # ... and use it here
            n=split(a[i],b)
            for(j=1;j<=n;j++)                  # preserve the input order
                print b[j],i                   # output
        }
    }' file
    C 0.98
    A 0.77
    B 0.77
    Z 0.77
    G 0.65
    

    测试相反顺序:

    $ tac file | awk '# above awk script'
    C 0.98
    Z 0.77
    B 0.77
    A 0.77
    G 0.65
    
    推荐文章