• ベストアンサー

テキストファイルの行抽出

linux環境のプログラムについて質問です。 ある特定のファイル(テキストファイル)内のデータで 指定の行を抽出する方法を教えていただきたいと思います。 現在はawkを使用してbashスクリプト内で下記のように head, tailを使用していますが、処理が重いように 感じます。perlまたはawkなどで行抽出の軽い処理は できないでしょうか? (他のunixコマンドでも結構です。) ---------------------------------------- RNUM=`awk 'END{print NR}' $1` #行番号取得 for iwl in `seq 1 $RNUM`;do BASE=`head -n $iwl $1 | tail -n 1` done #iwl ---------------------------------------- Fortran, Cなども使えますが、色々組み合わせて使う上で bash内のスクリプトで行ないたいと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

特定の行目の行を取り出したいのなら、head|tailではなく、sedを使うのが普通です。 BASE=`sed -n ${iwl}p $1` >例としまして >1 3 2 >2 1 4 >というデータが在るときに >./calc-test 1 3 2 >./calc-test 2 1 4 これが目的なら、10行目から200行目が対象だとして、 sed -n '10,200s/^/.\/calc-test /p' $1 | sh ですね。10行目から200行目の行頭に "./calc-test " を追加してそれをshで処理します。 実行したいコマンド列をsedやawkあるいはviで作った後、shにパイプして処理させるというのは良くあるパターンです。覚えておくとよいでしょう。 ファイル全体が対象なら、sed -n 's/^/.\/calc-test /p' $1 | sh 20行目から最後までなら、sed -n '20,$s/^/.\/calc-test /p' $1 | sh

noname#29127
質問者

お礼

回答ありがとうございます。 実行して実際に試しました。できました。 非常に助かります。 >実行したいコマンド列をsedやawkあるいはviで作った後、 >shにパイプして処理させるというのは良くあるパターンです。 >覚えておくとよいでしょう。 shは使ったことがありませんでした。質問以上の回答を いただき感謝いたします。

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

上記のスクリプトを実行しますと BASEには、指定されたファイルの各行が1行から最終行まで順にセットされますが、 あなたが抽出なさりたいのは、どの行でしょうか。 「指定の行を抽出する方法」の指定の行の意味は、最終行という意味でしょうか?

noname#29127
質問者

補足

回答ありがとうございます。 行ないたい処理は特定の行(例えば10から200行)、または全行に 対して「一行単位」で処理を行ないたいのです。 上記は全行の例ですが、 forと (2行下の)doneの中に 行単位の処理を記載します。 例としまして 1 3 2 2 1 4 というデータが在るときに ./calc-test 1 3 2 ./calc-test 2 1 4 というようにプログラムの引数として処理を行ないたいのです。 全行、あるいは特定の行に同じ処理ができましたら、別の 方法でも問題ありませんが、何か御存じでしょうか?

関連するQ&A