1

次のようなデータを含む数千のファイルがあります。

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 モジュールにアクセスできず、インストールする方法もありません (それ以外の場合は非常に簡単かもしれません)。

どんな助けでも大歓迎です。

4

2 に答える 2