著者:USP研究所技術研究員 新美勇一
今回は、業務システムの処理に見立てた簡単な例題で2つ実装例を挙げ、レビューを行いたいと思います。
本記事掲載のシェルスクリプトマガジンvol.48は以下リンク先でご購入できます。
USP研究所 通販サイトでは、個人用uspTukubaiのご購入も可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
#!/bin/bash export PATH=/home/UTL:/home/TOOL:${PATH} export LANG=ja_JP.UTF-8 tmp=/tmp/$$-$(basename $0)_$(date +%Y%m%d%H%M%S) # 一時ファイル # エラー処理 ERROR_EXIT() { echo "ERROR!!" exit 1 } #---------------------------------------------- # 更新データの読み込み #---------------------------------------------- # 更新データは、適用日時点の全カラムが担保されているとする # また、1社員コードに対し複数の適用日の変更データは発生しないとする cat input_file1 | # 1:社員コード 2:社員名 3:住所 4:電話番号 5:生年月日 # 6:交通費 7:適用日 # # キーと、更新対象のカラム住所のみを取り出す self 1 3 7 > $tmp-input_data # 1:社員コード 2:住所 3:適用日 [ $(plus ${PIPESTATUS[@]}) -ne 0 ] && ERROR_EXIT #---------------------------------------------- # 更新データより未来の社員情報を取得 #---------------------------------------------- # 社員情報 # 1:社員コード 2:社員名 3:住所 4:電話番号 5:生年月日 # 6:交通費 7:適用日 # より対象のレコードを取得する # (更新データの適用日より未来のもの) cat SHAIN_JOHO | join1 key=1 $tmp-input_data - | # 1:社員コード 2:更新.住所 3:更新.適用日 4:社員名 5:住所 # 6:電話番号 7:生年月日 8:交通費 9:適用日 # # 更新.適用日 < 社員情報.適用日 awk '$3<$9' | # # 更新データの住所を反映する # awk '{ $5=$2; print; }' | # # 移送済の付与情報(更新データ部分)を削除 delf 2 3 > $tmp-shain_joho_mirai # 1:社員コード 2:社員名 3:住所 4:電話番号 5:生年月日 # 6:交通費 7:適用日 [ $(plus ${PIPESTATUS[@]}) -ne 0 ] && ERROR_EXIT #---------------------------------------------- # 更新データと未来の社員情報(今回の更新反映) # を社員情報ファイルへ反映 #---------------------------------------------- # 更新データ(適用日の社員情報)+未来の社員情報(今回の更新反映) upl key=1@7 input_file1 $tmp-shain_joho_mirai | # 1:社員コード 2:社員名 3:住所 4:電話番号 5:生年月日 # 6:交通費 7:適用日 # # 更新情報を優先して社員情報ファイルの内容とマージ upl key=1@7 SHAIN_JOHO - > $tmp-shain_joho.upd [ $(plus ${PIPESTATUS[@]}) -ne 0 ] && ERROR_EXIT #TODO mv $tmp-shain_joho.upd SHAIN_JOHO [ $(plus ${PIPESTATUS[@]}) -ne 0 ] && ERROR_EXIT #' rm -f $tmp-* exit 0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 更新前の状態 $ cat SHAIN_JOHO 001 山田太郎 住所1 123-4567-8901 19900707 10000 20010101 001 山田太郎 住所1 123-4567-8901 19900707 12000 20150101 001 山田太郎 住所1 123-4567-8901 19900707 20000 20170228 # 2017年1月15日付の更新データのファイル $ cat input_file1 001 山田太郎 住所2 123-4567-8901 19900707 12000 20170115 # シェルスクリプト実行 $ ./sample1 # $ cat SHAIN_JOHO 001 山田太郎 住所1 123-4567-8901 19900707 10000 20010101 001 山田太郎 住所1 123-4567-8901 19900707 12000 20150101 001 山田太郎 住所2 123-4567-8901 19900707 12000 20170115 001 山田太郎 住所2 123-4567-8901 19900707 20000 20170228 # 基準日=2017/3/31時点の情報を取得する $ gawk '$1==1&&$7<=20170331' SHAIN_JOHO | getlast key=1 001 山田太郎 住所2 123-4567-8901 19900707 20000 20170228 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/bin/bash export PATH=/home/UTL:/home/TOOL:${PATH} export LANG=ja_JP.UTF-8 tmp=/tmp/$$-$(basename $0)_$(date +%Y%m%d%H%M%S) # 一時ファイル # エラー処理 ERROR_EXIT() { echo "ERROR!!" exit 1 } #---------------------------------------------- # 更新データの読み込み # 社員情報ファイルへ反映 #---------------------------------------------- # 更新データは、キーと変更カラム以外、「@」が設定されているとする # また、1社員コードに対し複数の適用日の変更データは発生しないとする cat input_file2 | # 1:社員コード 2:社員名 3:住所 4:電話番号 5:生年月日 # 6:交通費 7:適用日 # # 更新情報を優先して社員情報ファイルの内容とマージ upl key=1@7 SHAIN_JOHO2 - > $tmp-shain_joho.upd [ $(plus ${PIPESTATUS[@]}) -ne 0 ] && ERROR_EXIT #TODO mv $tmp-shain_joho.upd SHAIN_JOHO2 [ $(plus ${PIPESTATUS[@]}) -ne 0 ] && ERROR_EXIT #' rm -f $tmp-* exit 0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ cat SHAIN_JOHO2 | keta -- 001 山田太郎 住所1 123-4567-8901 19900707 10000 20010101 001 @ @ @ @ 12000 20150101 001 @ @ @ @ 20000 20170228 # 最新の状態を取得する $ cat SHAIN_JOHO2 | gawk '$1==1&&$7<=20170331' | underlay num=1 001 山田太郎 住所1 123-4567-8901 19900707 20000 20170228 # 更新ファイル $ cat input_file2 001 @ 住所2 @ @ @ 20170115 # シェルスクリプト実行 $ ./sample2 $ cat SHAIN_JOHO2 | keta -- 001 山田太郎 住所1 123-4567-8901 19900707 10000 20010101 001 @ @ @ @ 12000 20150101 001 @ 住所2 @ @ @ 20170115 001 @ @ @ @ 20000 20170228 # 再度、最新の状態を取得する # 住所と交通費が最新の状態になっている $ cat SHAIN_JOHO2 | gawk '$1==1&&$7<=20170331' | underlay num=1 001 山田太郎 住所2 123-4567-8901 19900707 20000 20170228 |