我正在尝试对存储在 csv 中的数据进行排序。
我的数据如下:
name,date,time
DEF,01/02/2021,06:00
HIJ,31/01/2021,07:50
ABC,01/02/2021,05:50
*(日期存储为 dd/mm/yyyy)
我试图按名称排序,然后按日期排序,然后按时间排序,我尝试了各种组合,但无法弄清楚。
使用sort -t, -k1 -k2,3 -u >> $report
名称按升序排列,但无法为其余两列获得相同的结果。
更新:抱歉,已经过去了一整天了,不知道为什么我用了一张桌子
答案1
使用米勒 (https://github.com/johnkerl/miller),并从
name,date,time
DEF,01/02/2021,06:00
HIJ,31/01/2021,07:50
ABC,01/02/2021,05:50
ABC,01/02/2021,05:40
正确格式化日期和时间,然后排序
mlr --csv put -S '$tmp=strptime(($date." ".$time), "%d/%m/%Y %H:%M")' \
then sort -f name,tmp \
then cut -x -f tmp ./input.csv>./output.csv
你将会拥有
+------+------------+-------+
| name | date | time |
+------+------------+-------+
| ABC | 01/02/2021 | 05:40 |
| ABC | 01/02/2021 | 05:50 |
| DEF | 01/02/2021 | 06:00 |
| HIJ | 31/01/2021 | 07:50 |
+------+------------+-------+
答案2
正在玩csvsort
,但它似乎想重写日期和时间字段:
$ csvsort --date-format '%d/%m/%Y' -c date,time file
name,date,time
HIJ,2021-01-31,0:07:50
ABC,2021-02-01,0:05:50
DEF,2021-02-01,0:06:00
在这里,csvsort
从csvkit
用于对第二个和第三个字段上的数据进行排序(按名称)。第二个字段是日期字段,我们提供了一个用 来描述它的格式字符串--date-format
。查看man strptime
哪些格式字符串在您的系统上有效。
答案3
给定
$ cat file
DEF,01/02/2021,06:00
HIJ,31/01/2021,07:50
ABC,01/02/2021,05:50
然后按日期时间(年+月+日+时间)排序,增加
sort -t, -k2.7,2.10n -k2.4,2.5n -k2.1,2.2n -k3,3 file
HIJ,31/01/2021,07:50
ABC,01/02/2021,05:50
DEF,01/02/2021,06:00
该-k
选项指定为
'-k POS1[,POS2]'
指定由 POS1 和 POS2 之间的行部分(或行尾,如果省略 POS2)组成的排序字段, 包括的。 ...每个 POS 的格式为“F[.C][OPTS]”,其中 F 是要使用的字段的编号,C 是从字段开头算起的第一个字符的编号。字段和字符位置从 1 开始编号
通过文件中的标题行,我们有一些额外的 shell 语法:
$ cat file
name,date,time
DEF,01/02/2021,06:00
HIJ,31/01/2021,07:50
ABC,01/02/2021,05:50
然后
{
IFS= read -r header
echo "$header"
sort -t, -k2.7,2.10n -k2.4,2.5n -k2.1,2.2n -k3,3
} < file
name,date,time
HIJ,31/01/2021,07:50
ABC,01/02/2021,05:50
DEF,01/02/2021,06:00