AWK:欠落している行を追加し、csvファイルの特定の列を「0」に設定する

AWK:欠落している行を追加し、csvファイルの特定の列を「0」に設定する

(注:詳細な質問は「スパムのようです」とブロックされ、質問が大幅に短縮されました。)

awk / gawkを使用してセミコロンで区切られたcsvファイルのデータ範囲に欠落している行を追加するのに問題があります。

サンプルデータ(csv)

date;city;gender;status;value
2019-10;New York City;women;AL;5
2019-10;New York City;women;SC;2
2019-10;New York City;men;AL;3
2019-10;New York City;men;SC;1
2019-12;New York City;men;AL;5
2019-12;New York City;men;SC;3
2020-01;New York City;women;AL;8
2020-01;New York City;men;SC;2

ターゲット
各年(ファイルに表示される最初の年(ここでは「2019」)から始まり、ファイルに表示される最後の年(ここでは「2020」)で終わる)と月(ファイルに表示される最初の年から始まる)について、月(ここでは「10 「)で始まり、ファイル内の最後の月(ここでは「01」)で終わる4行でなければなりません。

「2019-10」月のサンプルデータは、必要なデータが正しく発生していることを示しています。つまり、
年の各月の4行、女性の場合は2行、男性の場合は2行、ステータスはALとSCです。

希望の出力

date;city;gender;status;value
2019-10;New York City;women;AL;5
2019-10;New York City;women;SC;2
2019-10;New York City;men;AL;3
2019-10;New York City;men;SC;1
2019-11;New York City;women;AL;0
2019-11;New York City;women;SC;0
2019-11;New York City;men;AL;0
2019-11;New York City;men;SC;0
2019-12;New York City;women;AL;0
2019-12;New York City;women;SC;0
2019-12;New York City;men;AL;5
2019-12;New York City;men;SC;3
2020-01;New York City;women;AL;8
2020-01;New York City;women;SC;0
2020-01;New York City;men;AL;0
2020-01;New York City;men;SC;2

欠落行の値はゼロでなければなりません。生データには、月行のないイベントも含まれます(女性または男性、行も提供されません)。

どんな助けでも大変感謝します。
これはこのプラットフォームの最初の投稿であり、私の母国語が英語ではないので、私が犯した間違いを許してください。

答え1

すべてのUnixシステムのすべてのシェルでawkを使用してください。

$ cat tst.awk
BEGIN {
    FS=OFS=SUBSEP=";"
    split("women" FS "men", genders)
    split("AL" FS "SC", statuses)
}
NR == 1 {
    print
    next
}
{
    vals[$1,$2,$3,$4] = $5
    if ( NR == 2 ) {
        begDate = $1
        city = $2
    }
    endDate = $1
}
END {
    split(begDate,begYm,/-/)
    split(endDate,endYm,/-/)
    for ( yr=begYm[1]; yr<=endYm[1]; yr++ ) {
        begMth = ( yr == begYm[1] ? begYm[2] : 1 )
        endMth = ( yr == endYm[1] ? endYm[2] : 12 )
        for ( mth=begMth; mth<=endMth; mth++ ) {
            date = sprintf("%04d-%02d", yr, mth)
            for ( i=1; i in genders; i++ ) {
                for ( j=1; j in statuses; j++ ) {
                    idx = date FS city FS genders[i] FS statuses[j]
                    print idx, vals[idx]+0
                }
            }
        }
    }
}

$ awk -f tst.awk file
date;city;gender;status;value
2019-10;New York City;women;AL;5
2019-10;New York City;women;SC;2
2019-10;New York City;men;AL;3
2019-10;New York City;men;SC;1
2019-11;New York City;women;AL;0
2019-11;New York City;women;SC;0
2019-11;New York City;men;AL;0
2019-11;New York City;men;SC;0
2019-12;New York City;women;AL;0
2019-12;New York City;women;SC;0
2019-12;New York City;men;AL;5
2019-12;New York City;men;SC;3
2020-01;New York City;women;AL;8
2020-01;New York City;women;SC;0
2020-01;New York City;men;AL;0
2020-01;New York City;men;SC;2

-上記は、たとえば「city」値にが含まれている場合Washington-on-the-Brazosにも機能します。なぜなら、値-にそれを含めず、代わりにEND部分を呼び出して日付を年と月に分けたからです。FSsplit()

関連情報