6

bashループでpasteコマンドを使用して、CSVファイルに新しい列を追加しています。CSVファイルを再利用したいのですが。現在、これを実現するために一時ファイルを使用しています。

while [ $i -le $max ]
    do
        # create text from grib2
        wgrib2 -d 1.$(($i+1)) -no_header myGribFile.grb2 -text tmptxt.txt

        #paste to temporary file
        paste -d, existingfile.csv tmptxt.txt > tmpcsv.csv  

        #overwrite old csv with new csv
        mv tmpcsv.csv existingfile.csv

        ((i++))
    done

いくつかの列を追加した後、ファイルがどんどん大きくなっているため、コピーが遅くなっています(すべてtmptxt.txtが約2 MBで、約100 MBに追加されます)。

Atmptxt.txtは、1つの列と1行に1つの値を持つプレーンなtxtファイルです。

1
2
3
.
.

その後existingfile.csv

1,1,x
2,2,y
3,3,z
.,.,.
.,.,.

貼り付けコマンドを使用して既存のファイルに列を追加する方法はありますか?または他の方法はありますか?

ありがとう

4

2 に答える 2

6

操作を2つに分割することは可能でしょうか?すべての中間ファイルを生成するための1つのステップ。もう1つは、すべての最終出力ファイルを生成するためのものです。アイデアは、最終ファイルを何度も読み直したり書き直したりしないようにすることです。

スクリプトへの変更は次のようになります。

while [ $i -le $max ]
do
    n=$(printf "%05d" $i)    # to preserve lexical order if $max > 9
    # create text from grib2
    wgrib2 -d 1.$(($i+1)) -no_header myGribFile.grb2 -text tmptxt$n.txt
    ((i++))
done

#make final file
paste -d, existingfile.csv tmptxt[0-9]*.txt > tmpcsv.csv  

#overwrite old csv with new csv
mv tmpcsv.csv existingfile.csv
于 2012-10-16T16:29:21.500 に答える
0

プログラムによって出力される行数が一定であり、の行数と等しいと仮定しますexistingfile.csv(これは、を使用しているためですpaste) 。

免責事項:これによって処理が高速化されるかどうかは正確にはわかりません(ioリダイレクト>>がファイルに1回だけ書き込むかどうかによって異なります)。とにかくそれを試してみて、私に知らせてください。

つまり、基本的な考え方は

  1. ループが完了した後、出力を一度に追加します(変更に注意してください:wgribはこれに出力さ-れますstdout

  2. awkを使用して、すべてのlinenum行(linenumの行数existingfile.csv)を最後の最初のlinenum行に移動します

    保存先tempcsv.csv(同じファイルに保存する方法が見つからないため)

  3. 名前を変更/上書きexistingfile.csv

while [ $i -le $max ]; do
  # create text from grib2
  wgrib2 -d 1.$(($i+1)) -no_header myGribFile.grb2 -text -

  ((i++))
done >> existingfile.csv

awk -v linenum=4 '
  { array[FNR%linenum]=array[FNR%linenum]","$0 } 
  END { for(i=1;i<linenum;i++) print array[i%linenum] }
' existingfile.csv > tempcsv.csv

mv tempcsv.csv existingfile.csv

これが(内部的に)機能すると私が想像する方法である場合、書き込み回数ではexistingfile.csvなく2回の書き込みが必要です。$maxうまくいけば、これは物事をスピードアップするでしょう。

于 2012-10-16T14:56:29.067 に答える