Сортировка нескольких столбцов в csv, включая дату, хранящуюся в формате дд/мм/гггг

Я столкнулся с той же проблемой, но с немного другой настройкой:

  • WSL с Ubuntu и рыбой
  • SSH-подключение к удаленному серверу с Ubuntu и Bash

Я исправил это, установив fish и на удаленный сервер.

0
02.02.2021, 13:12
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]’

Specify a sort field that consists of the part of the line between POS1 and POS2 (or the end of the line, if POS2 is omitted), inclusive. ... each POS has the form ‘F[.C][OPTS]’, where F is the number of the field to use, and C is the number of the first character from the beginning of the field. Fields and character positions are numbered starting with 1


Со строкой заголовка в файле у нас немного больше синтаксиса оболочки:

$ 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
1
18.03.2021, 22:33

Играюсь с 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используется для сортировки данных во 2-м и 3-м полях (по имени ). Второе поле — это поле даты, и мы предоставляем строку формата, описывающую его с помощью --date-format. См. man strptime, какие строки формата допустимы в вашей системе.

2
18.03.2021, 22:33

Использование фрезерного станка(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 |
+------+------------+-------+
3
18.03.2021, 22:33

Теги

Похожие вопросы