- ベストアンサー
プログラム/条件分岐について2
プログラム初心者です. (言語: C shell (csh)) 『ファイルAは上から5行分を使用する』 『もしファイルBに, Cの答えが2つ以上ある場合は, 最初の答えを選択する』 『もし, Dの答えが2つ以上ある場合は, ファイルEから5行目までを使用する』 というプログラムをそれぞれ組みたいと思っております. 私の日本語説明が稚拙でわかりにくいかもしれませんがどなたか教えてくださると嬉しいです>< プログラム質問第二段です...(涙) 書いて実行するたびにエラーが出てくるので質問させてもらいます>< どうぞよろしくお願いいたします.
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
シェルスクリプトを作るときのコツは「条件分岐はなるべく使わない」だと思っています。 「条件に合っていたら処理する」 ではなく 「条件に合っているものを取り出して、その全てを処理する」 その方が見た目も簡単で、パフォーマンスがよいことが多いです。 whileでループ→ifで分岐など、本当にそれしか無いときだけに限った方がよいです。 また、cshを使う積極的な理由が無いのなら、B-sh系を使うのが一般的です。 対話シェルにcshを使っていても、スクリプトをshで書くことに何の問題もありません 質問中の「使用する」「選択する」というのがどんな意味で使っているかがよくわかりません。 また、ファイルの中がどうなっているかもわかりません。 なので、以下のことはそのまま使えないかもしれません。 1. headという、そのものずばりのコマンドがあります。tailと組み合わせれば、任意の箇所から任意の行を抜き出せます。 sedのオプションとスクリプトの組み合わせでも可能です。 2. 「Cの答え」がどんな記述になっているか、が書いてないのでわかりません。 1行に書いてある、かつ、他と区別できる特定の書式がある、だったら grep 特定書式を抽出する表現 B | head -1 複数行だと sed -n '/Cの答えの始まり/,/Cの答えの終り/{p;q}' B とかでしょうか。 3. 前回のと組み合わせです。 ファイルAの行数が3以上なら処理が、cshなら if ( `wc -l < A` >= 3) 処理 endif ですか。 「Dの答えが2つ以上」なら grepでDの答えを抽出 → wcで行数を数える→2以上か判定 ですし、「ファイルEの5行目まで」は最初の質問のファイルがAからEに変わっただけです。
その他の回答 (1)
- ki073
- ベストアンサー率77% (491/634)
実際に書かれエラーの出るプログラムを貼付ければ、みなさん添削してくれるはずですが。 それはさておき >『ファイルAは上から5行分を使用する』 headを使うのが簡単です。ファイルの最初からの出力行数が指定できます、 >『もしファイルBに, Cの答えが2つ以上ある場合は, 最初の答えを選択する』 grepでCの答えを見つけるのかな?文字列検索じゃ答えかどうか判断できないのかな?? 判断が複雑になってくると、shellじゃ大変(できないということではなく)なので、 他のスクリプト言語(Ruby Perlなど)で書いて、その中からheadやgrepを呼び出す方法を私ならとります。
お礼
ありがとうございます. headは指定もできるんですね...知りませんでした. perlと平行してプログラムを書き換えているところなのです. 書き換え作業でこんなに手間取ってしまって^^; なるほど,呼び出す方法もあるんですね... たくさん教えていただいてありがとうございます!参考にさせていただきます^^
お礼
ありがとうございます. 丁寧に書いていただけて嬉しいです! 教えていただいたものを組み合わせて書いてみます^^ といってもまだまだわからないことだらけなのですが...w 色々と手段があるんですね,助かりました! また質問させていただいた時にはよろしく御願いします><