• ベストアンサー

test.htm の133048行目だけを削除したい

10MBぐらいあるファイル(test.htm) の、133048行目を、単に削除したいのですが、perl script (del.pl等のファイル)で、どのように書くのでしょうか?  awkとかsed とかを昔使った経験がありますが、perlのことをはじめたばかりで、さっぱり解りません. またperl初心者に向く基礎的なことを記したURLがありますでしょうか? またperl以外で、こうすれば、良い、という別手法情報も今後の参考には、ありがたいです、よろしくお願いします.

  • CGI
  • 回答数8
  • ありがとう数4

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.5

> 次に、コマンドラインで実施させる書き方を知りたくなりました 了解、Windowsなんですね。Windowsのシェルはシングルクォートを 理解してくれません。なので、 > c:\>cat test.html | gawk ' NR != 133048 { print } ' は、ダブルクォートに変えて、 c:\>cat test.html | gawk " NR != 133048 { print } " で OK です。 私も、unix と Windows を行ったり来たりしてますので、 良く間違えます (^^;

finetoothcomb
質問者

お礼

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

finetoothcomb
質問者

補足

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

その他の回答 (7)

回答No.8

ええと、一応私も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で…もうお呼びでないですか。 失礼しました。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.7

> > であれば、無理に 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

回答No.6

もう答えは出ていて、勝敗は決してますが(笑)、せっかくPerlで、 という最初のお伺いなのに、awkさんでしかまともな答えが出てないのも 哀しいので。 c:\> perl -ne "$. != 133048 and {print}" test.html わざと似せて書いたりして。他にも書き方はあります。 (ただし、ファイルの中身を全部読みこんでspliceを使うのは、巨大な ファイルの場合メモリを大量に消費するので効率が悪いでしょう。お薦め しません) PerlはもともとAwkをもっと強力に!という意図もあったようで、 だからBEGINだのENDだの、ほとんどそっくりに書くことができます。 > であれば、無理に perl を使わずとも、sed や awk でやってしまえば まあおっしゃるとおりですが、Perlでやるのがそれほど無理、無茶なこと でも…。Perlくんは普段いい加減ですがほんとうはやればできるいい子なんです…。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.4

このカテゴリに書き込んでいるということは、その削除をする、ということを CGIでやりたい、ということですよね? であれば、無理に perl を使わずとも、sed や awk でやってしまえば 良いのではないでしょうか? 例えば、awk でやるならば、こんな感じかな? #!/usr/bin/sh cat test.htm | awk ' BEGIN { print "Content-type:text/html\n" } NR != 133048 { print } '

finetoothcomb
質問者

お礼

回答ありがとうございます. 質問が曖昧ですみません. 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 というエラーが出てしまいます. よろしくお願い致します.

  • hero1000
  • ベストアンサー率29% (114/390)
回答No.3

ファイルを一行一要素の配列として読み出して、splice関数を使えばいいと 思います。 splice( Array , Offset , Length , List ) ; とすると、配列Arrayの第Offset要素からLength個の要素を取り除いて 配列Listと置き換えます。 ListとLengthは省略できますので、 splice( Array , Offset , 1 ) ; とすれば任意の要素を1つだけ削除できるはずです。

  • myeyesonly
  • ベストアンサー率36% (3818/10368)
回答No.2

perl は判らないので、今後の参考回答です。 UNIX (Linux含め)では、そのものずばりそういう編集に非常に便利な vi というエディタがあります。 これの Win 版があるので、試されてはいかがでしょう。

参考URL:
http://hp.vector.co.jp/authors/VA003457/vim/vim3/vim.html
  • akino4
  • ベストアンサー率18% (35/185)
回答No.1

一旦ファイルを読んで、その行だけ飛ばして出力しかないのかなぁ・・・ とりあえずman見る限りそんな感じ・・・・(;;) 日本語のmanページへのリンクを参考までに・・・

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

関連するQ&A

  • awkで特定の範囲の行を削除したい

    awkなどの使い方がよくわからないので教えてください。 あるテキストファイル中の、"del_start" という文字が入った行から"del_end" という文字が入った行までの全ての行を削除したファイルを作るシェルを作成したいと思っています。 awk(やsed、grep、cat ?)などを使って実現するにはどうすればいいのでしょうか? よろしくお願いします。

  • 3行ずつ足す

    AWK を使っていあのですが、perl への移行を目指して勉強しています。 (1) 行数が3の倍数 (2) 列数は分からない(スペース区切り。固定列数) (3) # はコメント行 というデータがあります。 このデータを perl に読み込ませて、  三行ずつ足して出力する ようなプログラムをつくっています。 例えば、6行4列のデータ test.dat # comment 1 2 3 5 3 2 1 6 2 2 2 7 4 5 6 7 6 5 4 6 5 5 5 5 を cat test.dat | sum3row.pl のように perl のプログラム sum3row.pl に読みこませて、三行ずつ足して # comment 6 6 6 18 18 18 18 18 という出力を得たいのです。 次の点で困ってます。 ●AWK の場合、今読み込んでいる行の列数は NF という変数で分かるのですが、perl ではよく分かりません。データへのアクセス自体は $data[2] のようにすれば良いことは分かっているのですが・・。 ●AWK の場合、今読み込んでいる行の番号は NR という変数で分かるのですが、perl ではよく分かりません。 すみませんが、よろしくお願いします。。 サンプルプログラムでも助かります(読んで自分で勉強しますので)。

    • ベストアンサー
    • Perl
  • ある単語を含む行と、1つ前の行とを削除するシェル

    UNIX初心者です。 シェル(Korn)で、あるファイル中に、単語 "iwa"を含んだら、その行と、1つ前の行とを削除したいシェルを作りたいのです。  つまり、grep, sed, awk などで、"iwa"を含む行がみつかったら、その行(iwaを含む行)と、なおかつ、1行前の合わせて、2行を削除するシェルを作りたいのですが、行番号(NR?)などを使うのでしょうか? よろしく、お願いします。

  • perlで特定行から特定行までを抜き出しor置換

    perlで以下のようなことをしたいと考えています。 以下のことを、コマンドラインから「perl ~」という形で 実行したいのですが、どのよにすればよいでしょうか。 1.特定行から特定行までを抜き出し 2.特定行から特定行の範囲で文字列置換 例えば、次のようなテキストファイルがあったとします。 example.txt ================================== #START aaaa hogehoge test okok perl script #END ================================== 上記ファイルを読み込んで、 1.「#START」から「#END」の間に挟まれた行だけ抜き出し 2.「#START」から「#END」の間で、「test」を置換 のです。 sedで言うところの sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt をやりたいのです。

    • ベストアンサー
    • Perl
  • sedコマンドによる最終行の削除について

    sedコマンドを使用してファイルの最終行を削除する方法を調べていたのですが 最終行の削除は問題なくできたのですが最終行から特定行までを消すため以下のコマンドを発行したのですがうまくいきませんでした。複数サイトを見てみたんですが構文自体は同じでしたのでおそらく問題ないとは思うですが何か気づく方がいたらお教えください。 以下実行コマンド sed -e '$-3,$d' sed_test.txt

  • awkで列指定をして削除

    awkかsedを利用して以下のファイルを処理したいです。 1 2 3 4 5 2 1 3 4 5 1 2 3 4 5 3 1 3 4 5 一列目の値が1の行のみ削除したいです。 2 1 3 4 5 3 1 3 4 5 こんな感じです。 実際に処理するファイルは膨大な行数ががあるためprintでは難しいです。 よろしくお願いします。

  • Perlで行頭にある文字が含まれている行を全部削除して詰めたい

    perl初心者です。以下のようにデータがならんでいる時、 test111 aaaaaaaaabbbbbbbbcccccc test112 aaaaccccabbbbbbbbcccccc test113 aaaaccaaabbbbbbbbcccccc test114 acccaaaaabbbbbbbbcccccc test111 aacaaaaaabbbbbbbbcccccc test112 accaaaaaabbbbbbbbcccccc test113 aaacccaaabbbbbbbbcccccc test114 aaaaaccaabbbbbbbbcccccc test112の行だけ削除して、さらにそこを詰めたい時のスクリプトを作成しています。 途中からわかりません。 行を削除する関数が調べても見つからないのです。 #!/usr/bin/perl ; open(IN, "test.doc") or die ; open(OUT, ">testout.doc"); while(<IN>) { chomp ; if (/(\S+)/) { $name = $1 ; if ($name =~ /^test112(\S+)/) { #ここでマッチさせて、一気に行を削除して、しかも行を詰めたいのですが ; } print OUT " \n" ; } } close (IN) ; close (OUT) ; 大変困っております。宜しくお願いします。

    • ベストアンサー
    • Perl
  • 行頭のn文字が重複した行を削除したい

    Windowsのコマンドラインで、テキストファイル内の重複行の削除を行いたいのですが、行全体ではなく、行の一部のみを比較して重複行を削除出来ないかと考えています。 例えば、以下の様な内容のファイルがあり、 行頭の3文字のみを比較対照とした場合、 -------------------------- aaa1 aaa2 bbb1 bbb2 bbb3 -------------------------- 以下の様な結果にしたいのです。 -------------------------- aaa1 bbb1 -------------------------- AWKやPerl、その他のコマンドでも構いませんので、どなたかご存知の方がおられましたらお教え頂けないでしょうか。

  • 行単位で並び替えて、重複行を削除したい

    WindowsXPです。 テキストファイル、A.TXTがあり、10000行くらいなのですが、 行単位で並べ替えて、重複している同じものがあれば、これを1行にまとめたいのです。 並べ替えだけならば、MSDOSで、 sort A.TXT > outfile.TXT でいけそうですが、重複行をまとめることは出来そうにありません。 バッチファイルで処理をしたいのでMSDOSで捜しているのですが方法はないのでしょうか。 MSDOSに限らないとすれば、何か簡単にできる方法はありますか。 何かスクリプトみたいな感じで出来るといろいろと応用が出来ていいのですが。 関連して、WindowsXPでも、PERLが使えると聞きました。 WEBで捜しましたが、どうもどれがいいのか、また、インストール方法もよくわかりません。 フリーで使える、Windows上のPERL、あるいは、MSDOS以上に使い勝手のよいスクリプトがあれば、教えてください。

  • WindowsでPerlをする際,1行目の"#! ~"はどのように?

    Perlの参考書・本等ではプログラムファイルの第1行目は #! /usr/local/bin/perl という1行がよく有りますが,WindowsXPを用いている場合では,この1行をどう直せばよいのでしょうか? #! (perl.exeが存在するフォルダのパス) でよいのでしょうか? 私はWindowsXPを使っていて,この1行を使わずにプログラムを書いておりましたので,この1行の意味がよく分かりません。 ある参考書には,"#!はその行に書いたコマンドに,ファイルの残りの部分を渡して実行すると言う性質を持っている"と有りました。だから,試しにfile1.plとfile2.txtを準備し, file1.plの中身  #! (perlの存在するフォルダのパス)\perl.exe  while(<STDIN>){   print;  } file2.txtの中身  hello world として,コマンドプロンプトで file1.pl < file2.txt としたのですが正しく動作しませんでした.(perl file1.pl < file2.txt と入力した場合は正しく"hello world"となりました)

    • ベストアンサー
    • Perl

専門家に質問してみよう