如何按特定列对csv进行排序

6

我尝试通过第四列来对包含温度的CSV进行排序。

Sort -n -k4 temperature.csv

结果如下所示:

我得到了这个:

2017-06-24 11:20,23.57,19.0,16.7,0.087,3.615
2017-06-24 11:25,23.51,19.0,16.7,0.087,3.689
2017-06-24 12:45,22.03,19.0,17.1,0.096,4.152
2017-06-24 13:00,21.92,19.0,17.1,0.096,4.229
2017-06-24 14:00,22.22,19.0,17.4,0.197,4.639
2017-06-24 14:25,22.21,19.0,17.5,0.197,4.774
2017-06-24 15:10,22.30,19.0,17.1,0.134,5.472
2017-06-24 16:00,22.42,19.0,17.3,0.134,5.93
2017-06-24 17:45,22.07,21.0,17.0,0.144,6.472
2017-06-24 18:25,21.90,21.0,16.9,0.15,6.814
2017-06-24 19:40,23.01,21.0,16.9,0.318,8.503

正如您所见,第四列的排序不正确。我期望在第一行中出现17.5,在最后一行中出现16.7。

我还尝试了这个:

sort -n -t. -k4,1n temperature.csv

结果与先前示例完全相同。 有谁能给我一个提示?

2个回答

9

使用以下sort命令:

sort -t, -k4,4 -nr temperature.csv

输出结果:
2017-06-24 14:25,22.21,19.0,17.5,0.197,4.774
2017-06-24 14:00,22.22,19.0,17.4,0.197,4.639
2017-06-24 16:00,22.42,19.0,17.3,0.134,5.93
2017-06-24 15:10,22.30,19.0,17.1,0.134,5.472
2017-06-24 13:00,21.92,19.0,17.1,0.096,4.229
2017-06-24 12:45,22.03,19.0,17.1,0.096,4.152
2017-06-24 17:45,22.07,21.0,17.0,0.144,6.472
2017-06-24 19:40,23.01,21.0,16.9,0.318,8.503
2017-06-24 18:25,21.90,21.0,16.9,0.15,6.814
2017-06-24 11:25,23.51,19.0,16.7,0.087,3.689
2017-06-24 11:20,23.57,19.0,16.7,0.087,3.615

  • -t, - 字段分隔符

  • -k4,4 - 只按第四个字段排序

  • -nr - 按数字逆序排序


1
一个正确、有用的答案(+1),但你可以提到如果数据文件包含“带引号的字符串,可能包含逗号(甚至换行符)”,sort可能会失败。更一般的解决方案应该涉及数据的解析。 - gboffi
1
@gboffi,对于理想和复杂的输入,会有另一个复杂的解决方案。对于当前的输入,简单的“排序”就可以完成任务。 - RomanPerekhrest

1

sort 命令虽然有一些技巧可以部分处理 CSV 文件,但它无法处理所有 CSV 格式的特性。csvsort 是一个很好的选择:

csvsort -c 4 temperature.csv

1
好的。这正是我所需要的。 - charlesz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接