Как сортировать по дням недели? [дубликат]

0
13.04.2017, 15:36
1 ответ

Иногда есть хорошие общие решения, а иногда, когда есть 7 фиксированных дней в неделе, это легко и очевидно жестко запрограммировать.

Дан входной файл (из связанного вопроса):

Name      On-Call     Phone
Carol     MONDAY      248.344.5576
Bob       TUESDAY     313.123.4567
Alice     WEDNESDAY   616.556.4458
Dave      THURSDAY    734.838.9800
Nobody    FRIDAY      634.296.3356
Mary      SATURDAY    313.449.1390
Ted       SUNDAY      248.496.2204

Следующий «однострочный» отсортирует его по дням недели:

$ { sed -n 1p input; 
    for d in SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY
    do grep " $d " input || printf "%-10s%-12s888.000.8888\n" "Nobody" "$d"; done }
Name      On-Call     Phone
Ted       SUNDAY      248.496.2204
Carol     MONDAY      248.344.5576
Bob       TUESDAY     313.123.4567
Alice     WEDNESDAY   616.556.4458
Dave      THURSDAY    734.838.9800
Nobody    FRIDAY      634.296.3356
Mary      SATURDAY    313.449.1390

{...} curly фигурные скобки группируют команды вместе (так что вы можете перенаправить вывод в новый файл, если хотите); команда sed печатает заголовок; а цикл for дает grep каждый день в том порядке, в котором они вам нужны.

При этом используется тот факт, что у вас есть жестко запрограммированный набор имен для дня недели, а также то, что ни один из этих дней не соответствует ни одному из ваших имен полей в заголовке. Если заголовок может совпадать, вы можете просто изменить внутренний grep на:

sed 1d input | grep " $d "

Другой вариант, чтобы быть более точным относительно соответствия дня недели во втором столбце, (для внутреннего цикла) :

awk -v day=$d '$2 == day' input
1
28.01.2020, 02:46

Теги

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