著者:大内智明
今回は、取得した固定長ファイルを元に、ユニケージ内で使用するフィールド形式ファイルに変換する方法について説明します。
記事本文掲載のシェルスクリプトマガジンvol.49以下リンク先でご購入できます。
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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
#!/bin/ush -xve # # <中略> # #/////////////////////////////////////////////////////////////////////////////// # データ処理部 #/////////////////////////////////////////////////////////////////////////////// #---------------------------------------------------- # 受信セマフォ #---------------------------------------------------- # ファイル日付 fnamedate=$(echo ${gday} | dayslash yymmdd 1) # セマフォ名称 納品訂正 semfname=SWHD0201 # HULFT受信ファイル echo {rcvsemd}/${semfname}.*.${gday}??????.zip | tarr | ugrep -v '\?' | # 1:ファイル名称 # # ファイルを変換 while read rsemf ; do # セマフォファイル名から受信ファイル本体のフルパスを取得 rcvf="${rcvd}/$(basename ${rsemf})" [ -e ${rcvf} ] || ERROR_EXIT # ファイル名称(拡張子なし) targetfilename="$(basename {rcvf} | sed 's/\.zip//g')" # ベースファイルの解凍 unzip -p ${rcvf} > ${tmp}-filebase # # 納品訂正はファイル分割はデータ事 # # 256で折り返し fold -w 256 ${tmp}-filebase | tr ' ' '_' | # 1:レコード区分 2:SEQ-NO 3:日付 4:伝票No.01 5:伝票No.02 # 6:伝票No.01番号 7:伝票No.02番号 8:余白 self 1.1.2 1.3.5 1.8.6 1.14.86 1.100.86 \ 1.186.9 1.195.9 1.204.53 > ${tmp}-${targetfilename}_base ## 伝票に分ける # 伝票1 self 1 2 4 6 3 ${tmp}-${targetfilename}_base | # 1:レコード区分 2:SEQ-NO 3:伝票No.01 4:伝票No.01番号 5:処理日付 # - # データを区分け self 1 2 4 3.1.6 3.7.8 \ 3.15.2 3.17.6 3.23.2 3.25.6 3.31.2 \ 3.33.6 3.39.2 3.41.6 3.47.2 3.49.6 \ 3.55.2 3.57.6 3.63.2 3.65.6 3.71.2 \ 3.73.6 3.79.2 3.81.6 5 | # 1:レコード区分 2:SEQ-NO 3:伝票番号 4:納品日1 5:伝票NO1 # 6:行番号1 7:納品数1 8:行番号2 9:納品数2 10:行番号3 # 11:納品数3 12:行番号4 13:納品数4 14:行番号5 15:納品数5 # 16:行番号6 17:納品数6 18:行番号7 19:納品数7 20:行番号8 # 21:納品数8 22:行番号9 23:納品数9 24:処理日付 gawk '{print "1",$0}' > ${tmp}-${targetfilename}_denpyo # 1:データ区分 2:レコード区分 3:SEQ-NO 4:伝票番号 5:納品日1 # 6:伝票NO1 7:行番号1 8:納品数1 9:行番号2 10:納品数2 # 11:行番号3 12:納品数3 13:行番号4 14:納品数4 15:行番号5 # 16:納品数5 17:行番号6 18:納品数6 19:行番号7 20:納品数7 # 21:行番号8 22:納品数8 23:行番号9 24:納品数9 25:処理日付 cat ${tmp}-${targetfilename}_denpyo | # 「4:伝票番号」が空のレコードを除く gawk '$4!="000000000"' | tee ${tmp}-${targetfilename}_yuko_record | # 合計するために、必要項目を取得 self 4 7/24 | # 1:伝票番号 2:行番号1 3:納品数1 4:行番号2 5:納品数2 # 6:行番号3 7:納品数3 8:行番号4 9:納品数4 10:行番号5 # 11:納品数5 12:行番号6 13:納品数6 14:行番号7 15:納品数7 # 16:行番号8 17:納品数8 18:行番号9 19:納品数9 # 伝票番号・行番号でsm2 するために、縦に並び替える tarr -2 num=1 | # 1:伝票番号 2:行番号 3:納品数 # 行番号が「00」のレコードを除去する delr 2 "00" | # sm2 の為にソート msort key=1/2 | # 伝票番号・行番号ごとに納品数を合計する sm2 1 2 3 3 | # 「3:納品数」を前ゼロ maezero 3.6 | # 伝票番号で横に展開 yarr num=1 | # 1:伝票番号 2:行番号1 3:納品数1 4:行番号2 5:納品数2 # 6:行番号3 7:納品数3 8:行番号4 9:納品数4 10:行番号5 # 11:納品数5 12:行番号6 13:納品数6 14:行番号7 15:納品数7 # 16:行番号8 17:納品数8 18:行番号9 19:納品数9 # 有効列を取得 self 1/19 > ${tmp}-${targetfilename}_gokei # 1:伝票番号 2:行番号1 3:納品数1 4:行番号2 5:納品数2 # 6:行番号3 7:納品数3 8:行番号4 9:納品数4 10:行番号5 # 11:納品数5 12:行番号6 13:納品数6 14:行番号7 15:納品数7 # 16:行番号8 17:納品数8 18:行番号9 19:納品数9 cat ${tmp}-${targetfilename}_yuko_record | # 合計したファイルに連結する項目を取得 lineup 4 1 2 3 5 25 | # 1:伝票番号 2:データ区分 3:レコード区分 4:SEQ-NO 5:納品日1 # 6:処理日付 # 念のため、getfirst getfirst key=1 > ${tmp}-${targetfilename}_sonota # 納品数合計項目とその他の項目を連結する join1 key=1 ${tmp}-${targetfilename}_sonota ${tmp}-${targetfilename}_gokei | # 1:伝票番号 2:データ区分 3:レコード区分 4:SEQ-NO 5:納品日1 # 6:処理日付 7:行番号1 8:納品数1 9:行番号2 10:納品数2 # 11:行番号3 12:納品数3 13:行番号4 14:納品数4 15:行番号5 # 16:納品数5 17:行番号6 18:納品数6 19:行番号7 20:納品数7 # 21:行番号8 22:納品数8 23:行番号9 24:納品数9 # ファイルの整形 self 3 4 2 5 1 7/24 6 | # 1:レコード区分 2:SEQ-NO 3:データ区分 4:納品日1 5:伝票番号 # 6:行番号1 7:納品数1 8:行番号2 9:納品数2 10:行番号3 # 11:納品数3 12:行番号4 13:納品数4 14:行番号5 15:納品数5 # 16:行番号6 17:納品数6 18:行番号7 19:納品数7 20:行番号8 # 21:納品数8 22:行番号9 23:納品数9 24:処理日付 gawk '{print $0,"'${sday}'","'${stime}'","_","1"}' | # 1:レコード区分 2:SEQ-NO 3:データ区分 4:納品日1 5:伝票番号 # 6:行番号1 7:納品数1 8:行番号2 9:納品数2 10:行番号3 # 11:納品数3 12:行番号4 13:納品数4 14:行番号5 15:納品数5 # 16:行番号6 17:納品数6 18:行番号7 19:納品数7 20:行番号8 # 21:納品数8 22:行番号9 23:納品数9 24:処理日付 25:受信日 # 26:受信時間 27:データ更新日 28:更新ステータス self 1/23 25/NF 24 | # 1:レコード区分 2:SEQ-NO 3:データ区分 4:納品日1 5:伝票番号 # 6:行番号1 7:納品数1 8:行番号2 9:納品数2 10:行番号3 # 11:納品数3 12:行番号4 13:納品数4 14:行番号5 15:納品数5 # 16:行番号6 17:納品数6 18:行番号7 19:納品数7 20:行番号8 # 21:納品数8 22:行番号9 23:納品数9 24:受信日 25:受信時間 # 26:データ更新日 27:更新ステータス 28:処理日付 self 1 24 0 > ${tmp}-${targetfilename}_sorting # 1:レコード区分 2:受信日 3:レコード区分 4:SEQ-NO 5:データ区分 # 6:納品日1 7:伝票番号 8:行番号1 9:納品数1 10:行番号2 # 11:納品数2 12:行番号3 13:納品数3 14:行番号4 15:納品数4 # 16:行番号5 17:納品数5 18:行番号6 19:納品数6 20:行番号7 # 21:納品数7 22:行番号8 23:納品数8 24:行番号9 25:納品数9 # 26:受信日 27:受信時間 28:データ更新日 29:更新ステータス 30:処理日付 # LV2へ保存 # ディレクトリ作成 mkdir -p ${outd} # ファイルをレコード区分+受信日付で分割 sorter -d ${outd}/${gday}/${targetfilename}.%1.%2 ${tmp}-${targetfilename}_sorting # セマフォを済みとする mv ${rsemf} ${rsemf}.SUMI done # 終了時刻の保存 # # <中略> # exit 0 |