【问题标题】:Linux sort numerically based on first columnLinux根据第一列进行数字排序
【发布时间】:2017-03-03 21:30:10
【问题描述】:

我正在尝试使用以下命令根据第一列中的数字对一长串 csv 文件进行数字排序:

->  head -1 file.csv ; tail -n +2 file.csv | sort -t , -k1n

(我正在使用 head/tail 命令跳过文件的第一行,因为它是标题并包含字符串) 但是,它不会返回完全排序的列表。一半是排序的,另一半是这样的:

9838,2361,8,947,2284
9842,2135,2,261,2511
9846,2710,1,176,2171
986,2689,32,123,2177
9888,2183,15,30,2790
989,2470,33,887,2345

谁能告诉我我做错了什么?我也在下面尝试了相同的结果:

-> sort -k1n -t"," file.csv

【问题讨论】:

    标签: linux command-line-interface


    【解决方案1】:

    tail -n +2 file.csv | sort -k1,2 -n -t"," 应该可以解决问题。

    【讨论】:

    • -k1,2 与 -k1,1 或什至 -k1 相比有什么作用?
    • 如果您省略-k 的第二个值,它将使用行尾。换句话说,-k 1 指定了一个从字段 1 到行尾的排序字段。
    • so -k1,2 指定从第 1 列到第 2 列的排序字段,而 -k1,1 指定它只是第 1 列?
    • 是的 - 在您的情况下,-k1,1 实际上更正确,尽管-k1,2 会产生相同的结果,因为第一列中没有重复项。
    【解决方案2】:

    要按第一列执行数字排序,请使用以下方法:

    tail -n +2 /file.csv | sort -n -t, -k1,1
    

    输出:

    986,2689,32,123,2177
    989,2470,33,887,2345
    9838,2361,8,947,2284
    9842,2135,2,261,2511
    9846,2710,1,176,2171
    9888,2183,15,30,2790
    

    -k pos1[,pos2]

    Specify a sort field that consists of the part of the line between pos1 and pos2 
    (or the end of the line, if pos2 is omitted), inclusive.
    In its simplest form pos specifies a field number (starting with 1) ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2015-10-09
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      相关资源
      最近更新 更多