awk は曜日ごとのパーセンテージを返します。

awk は曜日ごとのパーセンテージを返します。

したがって、CSVファイルにフライトデータセットがあり、遅れたフライトの割合を日付別にソートしたいと思います(列6)。 0は遅延なし、1は15分以上の遅延を意味します。

入力する:

DAY_OF_MONTH,"DAY_OF_WEEK","ORIGIN","DEST","DEP_TIME","DEP_DEL15","CANCELLED","DIVERTED","DISTANCE"
1,Tuesday,ORD,GRB,1003,0.00,0.00,0.00,322.248
1,Tuesday,TUL,ORD,1027,0.00,0.00,0.00,1083.42
1,Tuesday,EWR,TYS,1848,0.00,0.00,0.00,1168.61

出力:

Weekday, % delayed, delayed, total flights
Tuesday,0.00,0,3

データセットには実際には多くの行があり、毎月毎日の日付とすべてのフライトがあるため、これは実際の出力ではありません。

誰かが私がそれを把握するのを助けました。

#!/bin/awk
BEGIN { FS = OFS = "," }
FNR > 1 { total[$2]++; if ($6) delay[$2]++ }
END {
    print "\"weekday\"", "\"percentage_delayed\"", "\"delayed\"", "\"total_flights\""
    for ( day in total ) { print day, delay[day] / total[day] * 100, delay[day], total[day]}

}

ただし、awkファイルに保存して次のように実行しようとすると:端子出力

ベストアンサー1

#!/bin/awkawkに使用するように指示するとき名前代わりにスクリプトをスクリプトとして含むファイルコンテンツスクリプトを含むファイルの名前。書き込みのように:

awk './delayed_by_day_jan20.awk'

変える:

awk -f './delayed_by_day_jan20.awk'    

コマンドラインでawkスクリプトを含むファイルを指定するのと同じように、-fshebangはawkに渡されたファイル名(つまり、現在のスクリプトファイルの名前)を開き、その内容をawkスクリプトとして使用するように指示する必要があります。解釈する。

それでも....

Unix で作成したすべてのコマンドを 1 つのコマンドと考えてください。コマンドがawk、perl、shell、または他の言語で書かれているかどうかは重要ではありません。内容に応じて名前を付ける必要があります。する、実装方法ではなく。これを考えると、.awkor.shまたは他のもので終わるコマンドを使用してその言語を表すべきではありません。.perlこれにより、何よりもawkで書かれたコマンドをPerlで再実装でき、その逆も同様です。これを変更するために呼び出す他のコマンド。したがって、コマンド名はdelayed_by_day_jan20代わりにする必要がありますdelayed_by_day_jan20.awk

また、他の人はawk構文を理解するエディタを使用することを好むので、これに同意しませんが、私の考えでは、awkを呼び出すためにshebangを使用しないでください。ちょうどshebangを使用して使用するすべてのシェルを呼び出してから、単にawkを呼び出します。コマンドラインから呼び出すのと同じように、シェルスクリプトを使用してください。これはスクリプトの複雑さを大幅に減らし、ほとんどのタスクをawkで実行するのが便利な非常に一般的な場合に役立ちますが、存在確認などのいくつかのタスクをシェルで実行することも便利です。入力ファイルの生成、一時ファイルの生成、トラップ設定、コマンドパラメータをawk変数の割り当て、awkパラメータへの分離などhttps://stackoverflow.com/a/61002754/1745001そしてGoogle "awk shebang"これらの問題に関する追加情報。

シェルスクリプトを作成する方法は次のとおりです。

$ cat delayed_by_day_jan20
#!/usr/bin/env bash

awk '
BEGIN { FS = OFS = "," }
FNR > 1 { total[$2]++; if ($6) delay[$2]++ }
END {
    print "\"weekday\"", "\"percentage_delayed\"", "\"delayed\"", "\"total_flights\""
    for ( day in total ) {
        printf "%s,%0.2f,%d,%d\n", day, delay[day] / total[day] * 100, delay[day], total[day]
    }
}
' "${@:--}"

$ ./delayed_by_day_jan20 file
"weekday","percentage_delayed","delayed","total_flights"
Tuesday,0.00,0,3

次に、必要な操作を実行するようにawkスクリプトを変更します(そうでない場合)。問題があれば新しい質問をしてください。

おすすめ記事