【bash】マトリクス階層#1

#!/bin/bash

#csvファイルを取得
csvfile=$1
ymd=$(date '+%Y%m%d%H%M%S')
lineprime=1

cp -f ${csvfile} ${csvfile}_bk
#ファイル全体の行数を取得
fileline=$(grep -c "." ${csvfile}_bk)

#整形ファイル
outputfile=${ymd}_shaping.txt

#########################
# 前行カンマ整形処理 start
while read line
do

#現在行を取得
currentline=$lineprime
#現在行のカンマ数 (最大数)を取得
currentlinekanma=$(sed -n ''${currentline}p'' ${csvfile}_bk | awk -F ',' '{print NF}')

tmpprime=0
#横の論理
for prime in $(seq 1 $currentlinekanma)
do
#前行の配列を取得
currentarray_index=$(sed -n ''${currentline}p'' ${csvfile}_bk |awk -F [,] '{print $'$prime'}')
#値がある値を取得
if [[ `echo $currentarray_index|grep "."|wc -l` -eq 1 ]]; then
tmpprime=$prime
fi
done

#最末尾の値以降のnull部分以外のみをcsvファイルに残す
#tmpprime2 =$(sed -n ''${currentline}p'' ${csvfile}_bk|cut -d ',' -f -${tmpprime})
sed -n ''${currentline}p'' ${csvfile}_bk|cut -d ',' -f -${tmpprime} >> ${outputfile}

#sed -i ''${currentline}''d ${csvfile}_bk
#最終行だけ挿入できない問題を解消するために分岐
#if [[ $currentline -eq $fileline ]]; then
# sed -i '$a '${tmpprime2}'' ${csvfile}_bk
#else
# sed -i ''${currentline}'i '${tmpprime2}'' ${csvfile}_bk
#fi

lineprime=$((++lineprime))

done < ${csvfile}_bk
# カンマ整形処理 finish
#########################

#########################
# メイン処理 start

cp -f ${outputfile} ${csvfile}_bk
rm -f ${outputfile}
#初期化
lineprime=1

sed -n '1,2p' ${csvfile}_bk >> ${outputfile}

while read line || [[ `echo $line|grep "."|wc -l` -eq 0 ]]
do
lineprime=$((++lineprime))
#現在行を取得
currentline=$lineprime
#次行を取得
nextline=$(expr $currentline + 1)
#現在行がファイルの全体行数よりも大きい場合はbreakで抜ける
if [[ $currentline -gt $fileline ]]; then
break
fi
#前行を取得
beforeline=$(expr $currentline - 1)
#現在行のカンマ数 (最大数)を取得
currentlinekanma=$(sed -n ''${currentline}p'' ${outputfile} | awk -F ',' '{print NF}')
#現在行のカンマ数 (最大数)の値取得
currentlinekanmaprime=$(sed -n ''${currentline}p'' ${outputfile} |awk -F [,] '{print $'$currentlinekanma'}' )
#前行のカンマ数 (最大数)を取得
beforelinekanma=$(sed -n ''${beforeline}p'' ${outputfile} | awk -F ',' '{print NF}')
#前行のカンマ数 (最大数)の値取得
beforelinekanmaprime=$(sed -n ''${beforeline}p'' ${outputfile} |awk -F [,] '{print $'$beforelinekanma'}' )

#現在行のカンマ数 (最大数)の値取得が1の場合は、何もしない。
if [[ $currentlinekanma = 1 ]]; then
sed -i ''${currentline}''d ${outputfile}
sed -n ''${currentline}'p' ${csvfile}_bk >> ${outputfile}
sed -n ''${nextline}'p' ${csvfile}_bk >> ${outputfile}
#sed -n ''$(expr ${nextline} + 1)'p' ${csvfile}_bk >> ${outputfile}
#sed -n ''$(expr ${nextline} + 2)'p' ${csvfile}_bk >> ${outputfile}
continue
fi

currentarray=()
#前行のカンマ数が1以下の場合は現在の値だけを出力 。カンマ数が1以上であれば実施する。
if [[ $beforelinekanma -ge 1 ]]; then
#前行の配列を取得
beforearray=$(sed -n ''${beforeline}p'' ${outputfile} |awk -F [,] '{print $0}' |sed 's/,/"" /g')

#コピーされた前行配列を 、現在行の(最大数-1)分だけコピーする。
count=0
for t in ${beforearray[@]}
do
currentarray+=($t)
count=$((++count))

#配列の末尾に現在行の現在行の最大数値を付与する
if [[ ${count} -eq $(expr ${currentlinekanma} - 1) ]]; then
currentarray+=($currentlinekanmaprime)
break
fi
done

else
currentarray+=($currentlinekanmaprime)
fi

sed -i ''${currentline}''d ${outputfile}
echo ${currentarray[*]}|sed 's/""//g'|sed 's/ /,/g' >> ${outputfile}
#最終以外の場合 、次行を挿入する。
if [[ $currentline -ne $fileline ]]; then
sed -n ''${nextline}'p' ${csvfile}_bk >> ${outputfile}
fi
#printnum =$
#sed -i ''${currentline}''d ${outputfile}

#現在行がファイルの全体行数よりも大きい場合はbreakで抜ける
#if [[ $currentline -eq $fileline ]]; then
# sed -i '$a '${printnum}'' ${outputfile}
#else
# sed -i ''${currentline}'i '${printnum}'' ${outputfile}
#fi
done < ${outputfile}
# メイン処理 finish
#########################

#退避ファイルを元ファイルに戻す
#mv ${csvfile}_bk ${outputfile}

cat "${outputfile}"
rm -f ${outputfile}

この記事が気に入ったらサポートをしてみませんか?