街中で見かけて「グッときた人」の思い出

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内のスクリプトで行ないたいと思います。

A 回答 (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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

実行して実際に試しました。できました。
非常に助かります。


>実行したいコマンド列をsedやawkあるいはviで作った後、
>shにパイプして処理させるというのは良くあるパターンです。
>覚えておくとよいでしょう。

shは使ったことがありませんでした。質問以上の回答を
いただき感謝いたします。

お礼日時:2005/09/04 23:45

上記のスクリプトを実行しますと


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

この回答への補足

回答ありがとうございます。

行ないたい処理は特定の行(例えば10から200行)、または全行に
対して「一行単位」で処理を行ないたいのです。
上記は全行の例ですが、 forと (2行下の)doneの中に
行単位の処理を記載します。

例としまして
1 3 2
2 1 4
というデータが在るときに
./calc-test 1 3 2
./calc-test 2 1 4
というようにプログラムの引数として処理を行ないたいのです。


全行、あるいは特定の行に同じ処理ができましたら、別の
方法でも問題ありませんが、何か御存じでしょうか?

補足日時:2005/09/04 22:21
    • good
    • 0

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