按日期对CSV列按文本标题和数字列排序

时间:2016-04-29 00:47:58

标签: bash sorting csv

我有一个像这样的CSV文件:

<% if we're on the homepage %>
    <ul class="nav navbar-nav navbar-right nav-font">
        <li><%= link_to "About", about_path %></li>
        <li><%= link_to "Contact", new_contact_path %></li>
    </ul>
<% else %>
    <ul class="nav navbar-nav navbar-right nav-font-inverted">
        <li><%= link_to "About", about_path %></li>
        <li><%= link_to "Contact", new_contact_path %></li>
    </ul>        
<% end %>

订单金额每天都在变化。

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

我尝试过一系列不同类型的组合,这里有一些我认为可行的东西:

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

我对bash并不是超级知识,只是在这里搜索并谷歌寻求答案。

2 个答案:

答案 0 :(得分:3)

你很亲密:

$ 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选项最多使用两个参数,您可以在其中将排序字段的开头和结尾指定为基于一个字符串。 3.7n是&#34;从第3个字段的第7个字符到行尾,数字&#34;,3.1,3.2n用于&#34;第3个字段的第1个和第2个字符,数值&#34;等等。

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

答案 1 :(得分:0)

使用内置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