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を駆使しててもいいけど、コマンドでやっても楽しいと思います。