【问题标题】:Why linux sort is not giving me desired results?为什么 linux sort 没有给我想要的结果?
【发布时间】:2009-11-26 08:53:13
【问题描述】:

我有一个文件 a.csv,内容类似于下面

a,b,c
a  ,aa,  a
a b, c, f
a , b, c
a b a b a,a,a
a,a,a
a aa ,a , t

我正在尝试使用 sort -k1 -t, a.csv 对其进行排序 但它给出了以下结果

a,a,a
a  ,aa,  a
a aa ,a , t
a b a b a,a,a
a , b, c
a,b,c
a b, c, f

这不是第一列的实际排序。我做错了什么?

【问题讨论】:

    标签: linux csv shell sorting


    【解决方案1】:

    您也必须将结束位置指定为 1:

    sort -k1,1 -t, a.csv
    

    【讨论】:

    • 哦。 k1,1 似乎是要排序的列数。但是,如果文字更糟糕,这会起作用吗?
    【解决方案2】:

    试试看:sort -t, -k1,1 a.csv

    该人建议省略结束字段,它将对从字段n开始直到行尾的所有字符进行排序:

    -k POS1[,POS2]'
         The recommended, POSIX, option for specifying a sort field.  The
         field consists of the part of the line between POS1 and POS2 (or
         the end of the line, if POS2 is omitted), _inclusive_.  Fields and
         character positions are numbered starting with 1.  So to sort on
         the second field, you'd use `-k 2,2' See below for more examples.
    

    【讨论】:

      【解决方案3】:

      试试这个:

      sort -k 1,1 -t , a.csv
      

      sort 将-k 1 读取为“从第一个字段开始排序”——因此有效地违背了首先传递参数的意义。

      这在sort man page 中有记录,并在示例部分警告:

      在第二个字段上按数字排序 并通过排序解决关系 按字母顺序在第三和第四 字段五的字符。使用 `:' 作为 字段分隔符:

      $ sort -t : -k 2,2n -k 5.3,5.4

      请注意,如果您改用 -k 2-k 2,2sort 将使用所有 以第二个开头的字符 字段并延伸到末尾 行作为主 数字 键。为了 绝大多数应用程序, 处理跨越多个的键 字段作为数字不会做你的事 期待。

      【讨论】:

      • 这是示例中使用的 -n 开关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2021-04-18
      • 2020-08-06
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多