dポイントプレゼントキャンペーン実施中!

ubuntu ver9.04 上で以下のような連番(01~09)の付いたCSVファイルの4,5,11,12列目のフィールドを抜きだし区切り文字を","から空白に置き換え.datファイルにするというシェルプログラムを作っています.
たまに一部のファイルが空で出力されます.(ファイルは出力されるのですが中身がない)なぜでしょうか?
誰かご教示願います.
#!/bin/bash
passB="./data/sw0174-h13-d0-"
passA="0001"
kaku=".csv"
dat=".dat"
#echo $passB
# input file number
echo 'Please input minimum file number (ex.03)!'
read fnumin
echo 'Please input maximum file number (ex.05)!'
read fnumax
delta=`expr $fnumax - $fnumin`
echo "delta="
echo $delta
cnt=0
while [ "$cnt" -le "$delta" ]
do
echo "cnt="
echo $cnt
fpass=$passB$fnumin$passA$kaku
echo $fpass
cvtf=$passB$fnumin$passA$dat
echo $cvtf
cut -d ',' -f 4,5,11,12 $fpass > $cvtf
cat $cvtf | sed -e 's/,/ /g' > $cvtf
cnt=`expr $cnt + 1`
fnumin=`expr $fnumin + 1`
fnumin=0$fnumin
echo "fnumin="
echo $fnumin
done

A 回答 (2件)

>cat $cvtf | sed -e 's/,/ /g' > $cvtf



パイプは同時実行されるので、cat が $cvtf から読み出すのが速いか、>$cvtf がサイズをゼロにするのが速いか競争になります。勝ったり負けたりによって、結果が変わってくる。

cat $cvtf | sed -e 's/,/ /g' > $cvtf.out
mv $cvtf.out $cvtf

この回答への補足

有難うございました無事スクリプトが完成しました.

補足日時:2009/09/11 10:58
    • good
    • 0
この回答へのお礼

どこかの本にはパイプは左から右へ実行されると書いてありましたが違うのですねいい勉強になりましたありがとうございます.
catが読むファイル名とsedの吐くファイル名を別にして試してみます.

お礼日時:2009/09/10 23:47

より安全には


cat $cvtf | sed -e 's/,/ /g' > $cvtf.$$ && mv $cvtf.$$ $cvtf
くらいでしょうか.
一般論としてはリダイレクトの方が早いことが多いんですけどね.
    • good
    • 0
この回答へのお礼

有難うございました無事スクリプトが完成しました.

お礼日時:2009/09/11 10:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!