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と関連する良く見られている質問

QPerlのCGIでフォームのテキスト配列をPerlで取得するには?

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが配列になった場合、
#<input type="text" name ="namae">
#<input type="text" name ="namae">
#<input type="text" name ="namae">
# のような場合、3件取得する場合

exit;

__END__

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが...続きを読む

Aベストアンサー

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
------------------------------------------------

例) CGI.pmを使う場合 --------------------------------
use CGI;

$query = new CGI; # 新しいCGIオブジェクトの作成
@hoge = $query->param('hoge'); # パラメータhogeの内容の受け取り
------------------------------------------------

参考URL:http://www.futomi.com/lecture/form/cgilib.html#3.2,http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm#FETCHING_THE_VAL

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
---------------------------------------...続きを読む

QPerlの初歩の初歩の初歩(#!/usr/local/bin/perlについて)

いつもお世話になっています。
Perlを勉強し始めて1か月たっていない人間です。
調べてもよく分からず、気持ち悪いので
どうか教えてください。

Perlで記述するとき1行目にperlへのパスを書きますが
プロバイダでのパスは「#!/usr/local/bin/perl」です。
私のPC環境では「#!d:/perl/bin/perl」になります。

ある日、PC環境で動作検証するとき
間違ってプロバイダのパスのほうを記述してしまいました。
しかし、それでもPC上で動作しました。

なぜパスが違うのに動作するのでしょうか?

なお、わけの分からないまま
「Perlへのパスを通す」というのを昔
やったことがあります。関係がありますか?

ある場合、それをすると
「#!d:/perl/bin/perl」の「d:/perl/」の部分が
「/usr/local/」と同になるということなのでしょうか?

Aベストアンサー

httpdの種類や設定によっては1行目のパスを無視して動作させることが出来ます。
例えばAnHTTPDは最初からcgiの拡張子とperlを関連付けて使う仕様だった気がします。
Apache1.3(Win)もWindowsのOSでcgi拡張子とPerl.exeの関連付けがしてあれば動作させることが出来ます。

QCGIからsystem("display test.png");を呼び出すとエラーがでるのですが、なぜでしょうか。

CGIについて質問させていただきます。
初めてCGIでWEBアプリを作っているところです。ちなみにPerlも、初めて勉強しはじめました。私が作りたいものは、CGIから、GNUPLOTを使って画像を出力するものです。

error
display: unable to open X server `'., referer: http://....

コードは以下のようなものです。
#!/usr/bin/perl -w
use HTML::Template;
use strict;

gnuplot no syhori....

system "gnuplot /DS/tmp/gnuplot.plot";
system "cd/DS/tmp;ps2pdf /DS/tmp/gnuplot.ps";
system "convert /DS/tmp/gnuplot.pdf /DS/tmp/gnuplot.png";
system "display /DS/tmp/gnuplot.png";

コマンド(display /DS/tmp/gnuplot.png)や、Perl(CGIではなくPerlだけで試しにやってみました)を実行すると正常に画像が表示されるのですが、CGIの中に書くとエラーが出てしまいます。
どなたかよろしくお願いします。

CGIについて質問させていただきます。
初めてCGIでWEBアプリを作っているところです。ちなみにPerlも、初めて勉強しはじめました。私が作りたいものは、CGIから、GNUPLOTを使って画像を出力するものです。

error
display: unable to open X server `'., referer: http://....

コードは以下のようなものです。
#!/usr/bin/perl -w
use HTML::Template;
use strict;

gnuplot no syhori....

system "gnuplot /DS/tmp/gnuplot.plot";
system "cd/DS/tmp;ps2pdf /DS/tmp/gnuplot.ps";
system "con...続きを読む

Aベストアンサー

> ただ、なぜか画像へのパスを書いても、とどかないんですよ。。。。よく
> わかりません。

Web サーバが任意のディレクトリのファイルを外部に表示できるとセキュリ
ティ上問題があるので、それはそうです。とりあえず、画像ファイルを CGI
スクリプトと同じ場所にコピーして、表示できるか確認したらどうでしょ
う。

Qawkで行ごとの計算について

HP-UX,UNIX環境です。

あるファイルを⇒a.txtとします。
a.txtには以下のような記述だとします。(行は複数行)
20110322000000 00:00:00 PERFORMANCE all
20110322000100 00:00:00 PERFORMANCE all
20110322000200 00:00:00 PERFORMANCE all
20110322000300 00:00:00 PERFORMANCE all

shでのループ処理は以下のようにしたいです。
(1)2行目の1カラム目から1行目の1カラム目を引き算、
(2)計算結果をファイルにリダイレクト
(3)4行目の1カラム目から3行目の1カラム目を引き算
(4)計算結果をファイルにリダイレクト

※awkを使えば出来そうですが、やり方がわかりません。

お手数ですが、ご回答宜しくお願い致します。

Aベストアンサー

awk使ってよいなら、こうかな:

NR % 2 == 1 { s = $1 }
NR % 2 == 0 { print $1 - s }

Qawkでのsh処理について

HP-UX環境、UNIXです。

1行目の11カラム目にOUTが含まれているかつ2行目の11カラム目にINが含まれている行だけ
ファイルに出力するという処理を以下のように考えたんですが、うまくいきません。

awk'{m == NR % 2}
m==1{if($11~ "OUT")} &&
m==0{if($11~ "IN") print $0} ' [ファイル名]


文法的に誤っていますでしょうか??
回答宜しくお願い致します。

Aベストアンサー

べたなロジックですが

cat ファイル名 | awk '\
BEGIN { FILE=-1 }
{
 if (substr($0,11,3)=="OUT") {
  LINE=NR
 }
 if (NR==(LINE+1) && substr($0,11,2)=="IN") {
  print $0
 }
}
END {}' > 出力ファイル名

ではいかがでしょうか。(インデントのために全角空白が入っています)

「sh処理」は何を言っているのか分かりません。


このカテゴリの人気Q&Aランキング

おすすめ情報