【问题标题】:How to sort a file, based on its numerical values for a field?如何根据字段的数值对文件进行排序?
【发布时间】:2011-06-18 20:49:21
【问题描述】:

例如file.txt:

  100 foo
  2 bar
  300 tuu

当使用sort -k 1,1 file.txt时,行的顺序不会改变,尽管我们期待:

  2 bar
  100 foo
  300 tuu

如何根据绝对数值对由数字组成的字段进行排序?

【问题讨论】:

    标签: linux bash sorting command


    【解决方案1】:

    看看man page for sort...

       -n, --numeric-sort
              compare according to string numerical value
    

    所以这里是一个例子......

    sort -n filename
    

    【讨论】:

    • 谢谢大家,伙计们!这是有线的,因为我来回查看了它的手册页几次,但我没有看到那个选项。啊,我在一个简化的手册页上。该死!
    • 请注意,对于浮点数,使用-g, --general-numeric-sort 可能更可取。这进一步允许科学记数法,例如1.234E10等
    【解决方案2】:

    如果您正在对混合文本和数字的字符串进行排序,例如滚动日志的文件名,则使用 sort -n 进行排序将无法按预期工作:

    $ ls |sort -n
    output.log.1
    output.log.10
    output.log.11
    output.log.12
    output.log.13
    output.log.14
    output.log.15
    output.log.16
    output.log.17
    output.log.18
    output.log.19
    output.log.2
    output.log.20
    output.log.3
    output.log.4
    output.log.5
    output.log.6
    output.log.7
    output.log.8
    output.log.9
    

    在这种情况下,选项 -V 可以解决问题:

    $ ls |sort -V
    output.log.1
    output.log.2
    output.log.3
    output.log.4
    output.log.5
    output.log.6
    output.log.7
    output.log.8
    output.log.9
    output.log.10
    output.log.11
    output.log.12
    output.log.13
    output.log.14
    output.log.15
    output.log.16
    output.log.17
    output.log.18
    output.log.19
    output.log.20
    

    来自手册页:

       -V, --version-sort
              natural sort of (version) numbers within text
    

    【讨论】:

    • 这让我大吃一惊,谢谢!至少在我的 cygwin 上,让我感到困惑的另一件事是,即使将 ls 通过sed 替换以删除字母并只留下数字,显然彩色输出也会影响事物。所以运行ls --color=never 也有所作为。
    • 太棒了,-V 正是我想要的。我应该养成先浏览手册页的习惯。
    • 确实,-V 是我需要的版本!
    【解决方案3】:

    嗯,这里的大多数其他答案都是指

    sort -n
    

    但是,我不确定这是否适用于负数。这是我在 Fedora 9 上使用 6.10 版排序得到的结果。

    输入文件:

    -0.907928466796875
    -0.61614990234375
    1.135406494140625
    0.48614501953125
    -0.4140167236328125
    

    输出:

    -0.4140167236328125
    0.48614501953125
    -0.61614990234375
    -0.907928466796875
    1.135406494140625
    

    这显然不是按数值排序的。

    那么,我想更准确的答案是使用sort -n,但前提是所有值都是正数。

    P.S.:使用 sort -g 会返回与此示例相同的结果

    编辑:

    看起来区域设置会影响减号对订单的影响 (see here)。为了得到正确的结果,我刚刚做了:

    LC_ALL=C sort -n filename.txt
    

    【讨论】:

      【解决方案4】:

      您必须使用数字排序选项:

      sort -n -k 1,1 File.txt
      

      【讨论】:

        【解决方案5】:

        使用sort -nsort --numeric-sort

        【讨论】:

          【解决方案6】:

          您必须执行以下命令:

          sort -n -k1 filename

          应该这样做:)

          【讨论】:

            【解决方案7】:

            使用 sort -nr 进行降序排序。参考

            Sort

            请参阅上面的手册页以获取更多参考

            【讨论】:

              【解决方案8】:
                  echo " Enter any values to sorting: "
              read n
              i=0;
              t=0;
              echo " Enter the n value: "
              for(( i=0;i<n;i++ ))
              do
              read s[$i]
              done
              for(( i=0;i<n;i++ ))
              do
              for(( j=i+1;j<n;j++ ))
              do
              if [ ${s[$i]} -gt ${s[$j]} ]
              then
              t=${s[$i]}
              s[$i]=${s[$j]}
              s[$j]=$t
              fi
              done
              done
              for(( i=0;i<n;i++ ))
              do
              echo " ${s[$i]}  "
              done
              

              【讨论】:

              • 是否需要添加一些关于此代码作用的文字说明?
              猜你喜欢
              • 2021-11-04
              • 1970-01-01
              • 2017-06-15
              • 1970-01-01
              • 1970-01-01
              • 2015-11-10
              • 2021-06-04
              • 1970-01-01
              • 2018-05-18
              相关资源
              最近更新 更多