【问题标题】:Sorting numerically but not alphabetically when numbers are equal当数字相等时按数字排序但不按字母排序
【发布时间】:2018-06-25 18:36:53
【问题描述】:

我有一个这样的文件:

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

但任何随机顺序都可以。

【问题讨论】:

    标签: linux bash sorting


    【解决方案1】:

    你可以使用这个sort

    sort -k2rn -k1R file
    

    C 0.98
    B 0.77
    Z 0.77
    A 0.77
    G 0.65
    

    使用了 2 个排序选项:

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

    【讨论】:

    • 我得到了相同的结果,文件按字母顺序倒序排列。
    • 完成。我想要的是应用sort -R 维护数字排序。
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2020-01-02
      相关资源
      最近更新 更多