次のようなデータを含む数千のファイルがあります。
bash$ cat somefile0001.csv
col1;col2;col3; ..... ;col10
2.34;0.19;6.40; ..... ;4.20
3.8;2.45;2.20; ..... ;5.09E+003
基本的に、これは 10x301 のフィールド .csv ファイルで、上部にセミコロンで区切られたヘッダー ファイルが含まれています (簡潔にするために穴は含まれていません)。
したがって、私の目標は、科学表記法を10進数に変更して、すべての列を平均し、列ヘッダーを列平均とともに新しいcsvファイルに出力し、次にこれを数千のファイルに出力することです。
すべてのファイルを解析するための作業コードが既にありますが、平均化を機能させるための部分を取得できないようです
#!/bin/bash
filename=csvfile.csv
i=1
runningsum=0
echo ""> $filename.tmp.$i
tmptrnfrm=$(cut -f$i -d ';' $filename)
tmpfilehold=$filename.tmp.$i
echo "$tmptrnfrm" >> $tmpfilehold
trnsfrmcount=0
for j in $(cat $tmpfilehold)
do
if [[ $trnsfrmcount = 0 ]]]
then
echo -n "Iteration $trnsfrmcount:"
echo "$j" #>> $tmpfilehold
trnsfrmcount=$[$trnsfrmcount+1]
elif [[ $trnsfrmcount < 301 ]]
then
if [[ $(echo $j | sed 's/[0-9].[0-9][0-9]E+[0-9]/arbitrarystring/' ) == arbitrarystring ]]
then
tempj=$(printf "%0f" $j)
runningsum=$(echo '$runningsum + $tempj' | bc)
echo "$j" #>> tmpfilehold
trnsfrmcount=$[$trnsfrmcount+1]
else
echo "preruns: $runningsum"
runningsum=$(echo '$runningsum + $j' | bc)
echo "$j," #>> $tmpfilehold
echo "the running sum is: $runningsum"
trnsfrmcount=$[$trnsfrmcount+1]
fi
fi
done
totalz=$(echo '$runningsum / 300' | bc)
echo "here is the total"
echo "$totalz"
exit 0
ちょっと面倒なことはわかっています。実行中に何が起こっているかを確認するために、標準出力に余分な文字列をたくさん入れました。これを perl で行いたいのですが、bash でこれを実行できることを学んでおり、CSV モジュールにアクセスできず、インストールする方法もありません (それ以外の場合は非常に簡単かもしれません)。
どんな助けでも大歓迎です。