对 csv 中的多列进行排序,包括存储为 dd/mm/yyyy 的日期

对 csv 中的多列进行排序,包括存储为 dd/mm/yyyy 的日期

我正在尝试对存储在 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

在这里,csvsortcsvkit用于对第二个和第三个字段上的数据进行排序(按名称)。第二个字段是日期字段,我们提供了一个用 来描述它的格式字符串--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

相关内容