2016-06-26 6 views
-1

私は次のようなカンマ区切りファイルを解析し、変数に各フィールドを抽出しようとしている:whileループでbashスクリプトでカンマ区切りのファイルを解析する

bob,mechanic,single,swimming,/bob/tmp,batman, 
joe,architect,married,tennis,/joe/tmp,superman,34 

このスクリプトでは:

#!/bin/bash 

#|| [[ -n "$input" ]] 

while IFS=, read -r a b c d e f g; do 
    echo "$a" 

done < "commafile.txt" 

しかし、私は、コマンドラインから./parsecommasで(parsecommasと呼ばれる)のスクリプトを実行すると、スクリプトは何も出力せずにすぐに終了します。

私は間違っていますか?私はOSX Yosemiteを実行していて、xcodeを使ってスクリプトを編集してから、それを実行する端末を使用しています。私は欠陥のある目に見えないものをチェックしたが、誰も見つけていない。 commafile.txtは、bashスクリプトparsecommasと同じディレクトリにあります。

EDIT:C++プログラムを実行してファイルの最後の行しか読み込めなかったので、この問題は自分のコードではなく、私がテキストファイルを作成するために使用した方法である可能性があることに気付きました。私は自分のファイルを作成するために

touch commafile.txt 

を使用し、私はgetl​​ineのC++プログラムで(ファイル、行)を使用した場合、ファイルの最後の行を読み取ることだけができました。他の誰かが前にこの問題にぶつかっていますか? Mac/Text Editorで何が間違っているのですか?私はXCodeのか、テキストエディタのいずれかでファイルを開くときの線の全てが表示されている間

cat commafile.txt 

のみ、ファイルの最後の行を出力します。私はボックスの形をしたフィールドのdocという単語の内容をcommafile.txtにコピー・ペーストしました。

+0

# replace \r characters with \n tr '\r' '\n' <commafile.txt >commafile.fixed && mv commafile{.fixed,.txt} 

代わりを-d $'\r'readに渡すことで、あなたの代わりに、標準のUNIXのテキストファイルのこのフォーマットを期待して、あなたのループを変更することができ、次のように

あなたはこの問題を解決することができますIFSが動作しない文字があるのだろうか?コロン、セミコロン、カラット、星、ハッシュ記号などのように?言及すべきもう1つの事は、私がターミナルにタッチでファイルparsecommasを作成したという事実です。 – RFrank

+0

いいえ、IFSの影響を受けない文字はありません。 –

+0

ファイルの作成方法よりも重要なのは、ファイルがどのように*ファイルに埋め込まれているかです。たとえば、末尾に改行がない場合は、少なくともファイルの最後の行を読むことができないため、バグが発生します。 –

答えて

1

cat filenameは最後の行だけを印刷した場合、これはあなたのファイルはほぼ確実にというのLF(\n)またはCRLF(\r\n)改行以外のCR(キャリッジリターン、\r)を使用することを意味します。あなたは次のようにファイルを作成することで、このバグを再現することができますprintf '%s\r' "bob,mechanic,single,swimming,/bob/tmp,batman," "joe,architect,married,tennis,/joe/tmp,superman,34" >commafile.txt

これは\r文字が移行するとき、カーソルが同じ行の先頭に戻ってしまうためにのみファイルの最後の行を示すcatになりレコード間。これはあなたのバグを説明しています。readシェル組み込み関数は有効なUNIX行を期待しています。これは、\nで終了します。コードに\nが含まれていない場合、readは偽の値を返し、ループは実行されません。私もいた

while IFS=, read -r -d $'\r' a rest; do 
    printf '%s\n' "$a" # less buggy than echo 
done 
+0

答えをありがとう!私は戻って問題を作り直して修正しようと思います。 – RFrank

関連する問題