【问题标题】:Sort a CSV column by date with text header and numerical column使用文本标题和数字列按日期对 CSV 列进行排序
【发布时间】:2016-08-23 23:47:00
【问题描述】:

我有一个这样的 CSV 文件:

Order,Item,Date
387-0293,chips,04/26/2016
133-4454,soda,04/25/2016
284-9989,beer,04/27/2016

订单数量每天都在变化。

如何让第三列按日期排序?

我尝试了很多不同的组合,以下是我尝试过的一些我认为会奏效的方法:

cat test.csv | sort -t, -k3 > sorted.csv
cat test.csv | sort -u -r > sorted.csv
cat test.csv | sort -n -k3 > sorted.csv

我对 bash 不是很了解,只是在这里搜索并在谷歌上寻找答案。

【问题讨论】:

    标签: bash sorting csv


    【解决方案1】:

    使用内置 mktime 和 PROCINFO 的 GNU awk 的一种方式:

    awk -F, '
        BEGIN {PROCINFO["sorted_in"] = "@ind_str_asc"}
        NR==1 {print $0; next}
        {   
            split ($3, d, /[/]/); 
            time = mktime (d[3] " " d[1] " " d[2] " 00 00 00"); 
            sorted[time] = ((time in sorted) ? sorted[time] RS $0 : $0)
        } 
        END {for (key in sorted) print sorted[key]}
    ' file 
    Order,Item,Date
    133-4454,soda,04/25/2016
    387-0293,chips,04/26/2016
    284-9989,beer,04/27/2016
    

    【讨论】:

      【解决方案2】:

      你很接近:

      $ sort -t , -k 3.7n -k 3.1,3.2n -k 3.4,3.5n test.csv -o sorted.csv
      Order,Item,Date
      133-4454,soda,04/25/2016
      387-0293,chips,04/26/2016
      284-9989,beer,04/27/2016
      

      -k 选项最多有两个参数,您可以在其中将排序字段的开始和结束指定为从 1 开始的字符串。 3.7n 是“从第 3 个字段的第 7 个字符到行尾,数字”,3.1,3.2n 是“第 3 个字段的第 1 个和第 2 个字符,数字”等等。

      第一个排序字段在第一行第三个字段的末尾之后开始,因此它是空的,它在数字之前排序。

      【讨论】:

      • 完美的解释。我把完全相同的东西放在我的终端上,但它没有排序,知道为什么吗?我的系统或服务器上的版本号会有所不同吗?我正在使用 Mac 终端 GNU bash,版本 3.2.57(1)-release。
      猜你喜欢
      • 2014-07-06
      • 2014-05-08
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2019-08-23
      相关资源
      最近更新 更多