それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

JOINを使って出欠(出勤)の一覧を作る LEFT OUTERJOIN的なことをやって、NULLをゼロで埋めて、表を作る

JOINコマンドの例

JOINを使って出欠(出勤)の一覧を作る

LEFT OUTERJOIN的なことをやって、NULLをゼロで埋めて、表を作る

過去にもやったけど、書き直して。覚え直し。

次のようなデータを作りたい。

2023-08-01 1 1
2023-08-02 0 1
2023-08-03 0 0
2023-08-04 1 0
2023-08-05 0 1
2023-08-06 0 0
2023-08-07 0 0
2023-08-08 1 0
2023-08-09 0 1
2023-08-10 0 0

次のようなファイル一覧があるとする

ls 
2023-08-01.txt
2023-08-04.txt
2023-08-08.txt

歯抜けを補って、ファイルの有無を一覧表にする。

日付一覧を用意する。

cat << EOF > dates.txt
2023-08-01
2023-08-02
2023-08-03
2023-08-04
2023-08-05
2023-08-06
2023-08-07
2023-08-08
2023-08-09
2023-08-10
EOF

ファイル一覧を日付として取り出し<ファイルにする>

ls *.txt | sed -e 's/.txt/ 1/' > 稼働日

次のようになる。

cat 稼働日
2023-08-01 1
2023-08-04 1
2023-08-08 1

歯抜け担ってる日付をゼロでうめて、稼働日と非稼働日を一覧にする。

join -a 1 -o auto -e '0' dates  稼働日
2023-08-01 1
2023-08-02 0
2023-08-03 0
2023-08-04 1
2023-08-05 0
2023-08-06 0
2023-08-07 0
2023-08-08 1
2023-08-09 0
2023-08-10 0

事前にソートする必要がある。今回は日付なのでとくにソートは必要ない。

カラムを追加する。

Aさんの記録にBさんの記録を追加する。

ここまでの処理と同等の処理をおこない、カラムを追加する

Aさんの記録とBさんの記録を、ファイルに出力する

join -a 1 -o auto -e '0' dates  Aさん > a.txt
join -a 1 -o auto -e '0' dates  Bさん > b.txt

これらをさらにJOINして

join -a 1 -o auto -e '0' a.txt b.txt > member.txt

menber.txt ができた。

2023-08-01 1 1
2023-08-02 0 1
2023-08-03 0 0
2023-08-04 1 0
2023-08-05 0 1
2023-08-06 0 0
2023-08-07 0 0
2023-08-08 1 0
2023-08-09 0 1
2023-08-10 0 0

あとは、これをEXCELなどに貼り付ければ、簡単に表計算に使える。

別解

カウント(回数)を数えるなら、wc -l だけで十分ですけどね

find 記録 -type f | wc -l
cat  a.txt | grep -E '1$' | wc -l

応用例

  • 会議の出席者一覧から、各回の出欠に書き換えるとか。
  • 職員の源泉徴収票書類の提出状況を見るとか。
  • 回覧板の閲覧状況を見るとか

いろいろと応用例が考えられそうです。

ポイント

ファイル名の一覧をファイルとして取り出す。

ファイル名の有無=>記録として、ファイルの有無を0-1にフラグに変える

JOINコマンドを使って、NULL埋め(ゼロ埋め)をする。

join -a 1 -o auto -e 'N/A' いちらん  データ

「〇〇がある、〇〇がない」を「0 / 1 」に置き換えられるか。という問題がコンピューターを扱うセンスに関わる部分だと思う。

エクセルでVLOOKUPやSUMIFを駆使しててもいいけど、コマンドでやっても楽しいと思います。