曜日ごとに並べ替える方法は? [コピー]

曜日ごとに並べ替える方法は? [コピー]

私は見つけた以下のプロジェクトと非常によく似たプロジェクトを進めています。最高の答えユーザーはという追加のファイルを生成する必要がありますが、file3私は作成したくありません。私もgrepコマンドについて考えており、whileループの使用についても考えています。このスクリプトを実行する方法がある人はいますか?

曜日ごとに並べ替える方法は?

つまり、問題は代替ソリューションを提供することです。この回答追加ファイルを生成する必要はありません(file3例を参照)。

答え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

中かっこは{ ... }コマンドを一緒にグループ化します(必要に応じて出力を新しいファイルにリダイレクトできます)。コマンドはsedヘッダーを印刷し、ループは必要な順序で毎日提供しますforgrep

これは、ハードコードされた曜日名のセットがあり、ヘッダーのフィールド名と一致する曜日がないという事実を利用します。ヘッダーが一致する場合は、内部を次のように変更できますgrep

sed 1d input | grep " $d "

2番目の列の曜日とより正確に一致する別のオプションは、(内部ループの場合)次のようになります。

awk -v day=$d '$2 == day' input

関連情報