Иногда есть хорошие общие решения, а иногда, когда есть 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