Como ordenar por dia da semana? [duplicado]

0

Eu tenho um projeto em que estou trabalhando, que é muito parecido com o que eu encontrei abaixo, então eu não quero incomodar ninguém para ler novamente, no entanto, na pergunta eu encontrei o top answer O usuário precisou criar um arquivo extra chamado file3 , que é algo que não quero fazer. Eu também estava pensando sobre o comando grep , também pensei em usar um loop while. Alguém tem alguma maneira de começar este script?

como classificar pelo dia da semana?

Em outras palavras, a pergunta é: dê uma solução alternativa para esta resposta sem recorrer à criação de qualquer extra arquivo (como file3 no exemplo).

    
por Ali Soujod 21.03.2017 / 16:50

1 resposta

1

À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
    
por 21.03.2017 / 17:15