10MBぐらいあるファイル(test.htm) の、133048行目を、単に削除したいのですが、perl script (del.pl等のファイル)で、どのように書くのでしょうか? 

awkとかsed とかを昔使った経験がありますが、perlのことをはじめたばかりで、さっぱり解りません. またperl初心者に向く基礎的なことを記したURLがありますでしょうか?

またperl以外で、こうすれば、良い、という別手法情報も今後の参考には、ありがたいです、よろしくお願いします.

このQ&Aに関連する最新のQ&A

A 回答 (8件)

> 次に、コマンドラインで実施させる書き方を知りたくなりました



了解、Windowsなんですね。Windowsのシェルはシングルクォートを
理解してくれません。なので、

> c:\>cat test.html | gawk ' NR != 133048 { print } '

は、ダブルクォートに変えて、

c:\>cat test.html | gawk " NR != 133048 { print } "

で OK です。

私も、unix と Windows を行ったり来たりしてますので、
良く間違えます (^^;

この回答への補足

皆さんこのたびは各種の方法を教えてくださり、ありがとうございました!他にも簡単な あるいは、おもしろいやり方が、あったらご教示いただけたら幸いです.

補足日時:2001/06/01 16:27
    • good
    • 0
この回答へのお礼

成功しました!ありがとうございました!!

お礼日時:2001/06/01 16:26

ええと、一応私もPerl以前にsed, awkの人ではあったのですが…。


gawkやnawkならともかく、pureなawkの素朴なところにはほんと、泣かされましたよ。

つうわけで、ちょっと苦しいhead + tail。

C:\> sh -c "head -133047 test.html;tail +133049 test.html"

というかだいぶ苦しいですな。sh(bash)とheadとtailがないといけない。
cygwin環境なら、という。

それから、Rubyを出されたらPythonを出さぬわけにはいきますまい。
といっても、あまり知らないのでもっと粋な書き方があるかもしれませんが。
test.pyに
#!/usr/local/bin/python
import fileinput
for line in fileinput.input():
 if fileinput.lineno() != 3:
  print line,

と書いておいて(全角スペースは半角にすること)、
C:\>python test.py test.html

うーん、分が悪いな。あとはschemeで…もうお呼びでないですか。
失礼しました。
    • good
    • 0

> > であれば、無理に perl を使わずとも、sed や awk でやってしまえば


>
> まあおっしゃるとおりですが、Perlでやるのがそれほど無理、無茶なことでも…。

"perl"er にはそう思われちゃうのですが、先に sed や awk を憶えちゃうと
perl に移行するのが *おっくう* なのも事実なので…

# 少なくとも、私は (^^;

つうわけで、sed の場合も。

c:\> sed -e 133048d test.html

もう一つおまけに ruby の場合も。

c:\> ruby -pe "next if $. == 133048" test.html

ちなみに ruby だと perl とほとんど同じ書き方でもいけます。

c:\> ruby -ne "$. != 133048 and print" test.html
    • good
    • 0

もう答えは出ていて、勝敗は決してますが(笑)、せっかくPerlで、


という最初のお伺いなのに、awkさんでしかまともな答えが出てないのも
哀しいので。

c:\> perl -ne "$. != 133048 and {print}" test.html

わざと似せて書いたりして。他にも書き方はあります。
(ただし、ファイルの中身を全部読みこんでspliceを使うのは、巨大な
ファイルの場合メモリを大量に消費するので効率が悪いでしょう。お薦め
しません)

PerlはもともとAwkをもっと強力に!という意図もあったようで、
だからBEGINだのENDだの、ほとんどそっくりに書くことができます。

> であれば、無理に perl を使わずとも、sed や awk でやってしまえば

まあおっしゃるとおりですが、Perlでやるのがそれほど無理、無茶なこと
でも…。Perlくんは普段いい加減ですがほんとうはやればできるいい子なんです…。
    • good
    • 0

このカテゴリに書き込んでいるということは、その削除をする、ということを


CGIでやりたい、ということですよね?

であれば、無理に perl を使わずとも、sed や awk でやってしまえば
良いのではないでしょうか?

例えば、awk でやるならば、こんな感じかな?

#!/usr/bin/sh

cat test.htm | awk '
BEGIN { print "Content-type:text/html\n" }

NR != 133048 { print }
'
    • good
    • 0
この回答へのお礼

回答ありがとうございます. 質問が曖昧ですみません. windows98SEのDOS窓で、コマンドラインから実施したい、です. awkとか、sedで、dos のコマンドラインで、べたべたっと書いて実施させる書き方を教えてくださると幸いです. CGIは実は使った経験ありません.

--成功したこと--
上に教えていただいたやり方を参考に、NR != 133048 { print }だけを、delline.awkと別ファイルに作成して、c:\>cat test.html | gawk -f delline.awk としたら成功しました. 

--次にやりたくなったこと--
次に、コマンドラインで実施させる書き方を知りたくなりました. c:\>cat test.html | gawk ' NR != 133048 { print } ' とやると

C:\BIN\GAWK.EXE: cmd. line:1: ^ Invalid char ''' in expression

というエラーが出てしまいます. よろしくお願い致します.

お礼日時:2001/06/01 14:16

ファイルを一行一要素の配列として読み出して、splice関数を使えばいいと


思います。

splice( Array , Offset , Length , List ) ;
とすると、配列Arrayの第Offset要素からLength個の要素を取り除いて
配列Listと置き換えます。

ListとLengthは省略できますので、
splice( Array , Offset , 1 ) ;
とすれば任意の要素を1つだけ削除できるはずです。
    • good
    • 0

perl は判らないので、今後の参考回答です。



UNIX (Linux含め)では、そのものずばりそういう編集に非常に便利な vi というエディタがあります。

これの Win 版があるので、試されてはいかがでしょう。

参考URL:http://hp.vector.co.jp/authors/VA003457/vim/vim3 …
    • good
    • 0

一旦ファイルを読んで、その行だけ飛ばして出力しかないのかなぁ・・・


とりあえずman見る限りそんな感じ・・・・(;;)
日本語のmanページへのリンクを参考までに・・・

参考URL:http://www.att.or.jp/perl/man/perlfunc.1.html
    • good
    • 0

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


人気Q&Aランキング