Às vezes, há boas soluções gerais e, às vezes, quando há sete dias fixos da semana, é fácil e óbvio codificá-lo.
Dado um arquivo de entrada (da pergunta vinculada) de:
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
O seguinte "one-liner" irá classificá-lo por dia da semana:
$ { 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
As chaves { ... }
agrupam os comandos juntos (para que você possa redirecionar a saída para um novo arquivo, se desejar); o comando sed
imprime o cabeçalho; e o for
loop dá grep
a cada dia na ordem que você deseja.
Isso tira proveito do fato de que você tem um conjunto de nomes codificados para o dia da semana e também que nenhum desses dias corresponde a nenhum dos nomes de campo no cabeçalho. Se o cabeçalho puder ser igual, você poderia apenas alterar o grep
para:
sed 1d input | grep " $d "
Outra opção, para ser mais preciso sobre a correspondência do dia da semana na segunda coluna, é (para o loop interno):
awk -v day=$d '$2 == day' input