ファイルの特定行を抜き出す方法と文字列処理のスクリプトについて

このQ&Aのポイント
  • MacOSX(FreeBSD)を使って、引数を元にして任意のファイルの特定行を抜き出す方法と文字列処理のスクリプトについて教えてください。
  • ファイルの特定行を抜き出すスクリプトを作成したい場合、コマンドラインからファイル名と行番号を引数として受け取るようにします。また、文字列処理のスクリプトを作成する場合、ファイルをオープンし、行ごとに配列に格納して取り出す方法があります。どのようなコードを書けば良いでしょうか?
  • ファイルの特定行を抜き出す方法と文字列処理のスクリプトについて教えてください。
回答を見る
  • ベストアンサー

引数が元のコードと、ファイルの文字列処理について

よろしくお願いします。 MacOSX(FreeBSD)を使っています。 ●引数を元にして任意のファイルの特定行を  抜き出す方法?  コマンドラインから、   >./[スクリプト名] [ファイル名] [行番号]   (*例 >./test.pl ppp.txt 5)  を打って、   >kkk   (*その行番号の行)  と返ってくるスクリプトを作りたいのですが、  どうすれば良いのかさっぱり分かりません。  ファイルは固定では無く任意のファイルで  行いたいです。また行番号を忘れてコマンドを  入力した場合   (*例 >./test.pl 444.txt)  には、エラーメッセージを出したいのです。  どのようなコードを書けば良いでしょうか? ●文字列処理ですが・・  ファイルが   AAA   BBBCCC DDD EEEEE   FF GGGG HHH   IIIII   ・・・  とあった時に、  例えば3行目のGGGGだけを抜き出す  スクリプトはどうすれば良いでしょうか?  今やっている方針としては、   1.ファイルオープン   2.配列にいったん全部入れる   3.getc関数で1行ずつスカラーに取り込む   4.・・・  このあたりまで考えて息詰っています。  教えて頂けませんでしょうか? よろしくお願い致します。

  • aopoma
  • お礼率95% (123/129)
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • fxdwg99
  • ベストアンサー率45% (43/94)
回答No.1

相当無駄な方法ですが、以下のコードで任意の行を取り出せるでしょう。 open FF, "ファイル"; @aa = <FF>; ←全行を配列に読み込み close FF; print $aa[5]; ←6行目を表示 引数の数は$#ARGVか、@ARGV+0で分かりますので、 これで引数の抜けを調べることが出来ます。 文字列処理は、「文字列1 空白 文字列2 空白 文字列3」のときの 文字列2だけを取り出したい、というのであれば、 $aa =~ m/^[^ ]+ ([^ ]+) [^ ]+/; ←()の部分を取り出して、 print $1; ←$1で参照できる。

aopoma
質問者

お礼

ご回答ありがとうございます。 引数を元にしての抜き出しは出来ました。 文字列処理ですが、 >$aa =~ m/^[^ ]+ ([^ ]+) [^ ]+/; ←()の部分を取り出して、 >print $1; ←$1で参照できる。 で使用して何とか出来ました! ありがとうございました。

関連するQ&A

  • 今、awkを使ったシェルスクリプトを作っています。

    今、awkを使ったシェルスクリプトを作っています。 aaa bbb ccc ddd ee ff gggg hhh といったファイルから、 bbb,ccc ff,gggg を取り出したいと思っています。 そこで、以下のコマンドをwhileでまわして、$iを増加させることにより、 ファイルを一行ずつ読み取り、目的の列を取り出したく思っています。 A=`cat sample.txt|awk 'NR == $i {print NR, $2;}'` B=`cat sample.txt|awk 'NR == $i {print NR, $3;}'` ところが、awkコマンドの中の$iがシングルクォーテーションでくくられているので、 変数展開されなくて困っています。 何かよい方法があればご教授いただけますでしょうか?

  • CSVファイルの処理方法

    PerlでCSVファイルの処理をしようとしています。 CSVファイル(ここではdata1.csvとします)の中身は、A列とB列に数値が1000行程表記されています。 -5,1 -4,2 -3,3  ・  ・  ・ 作成したPerlのファイル(ここではtest1.plとします)下のようにし、 while ($_=<stdin>){ print"$_\n"; } Cygwinコマンド上で、 $ perl test1.pl <data1.csv と入力すると、CSVファイル(data1.csv)の数値がCygwinコマンド上に全て表記されます。 前置きが長かったのですが、CSVファイル(data1.csv)の3行目までの数値だけをCygwinコマンド上に表記したい場合、どのようにプログラムすればよいのですか。 お願いします。

    • ベストアンサー
    • Perl
  • 文字列の抽出がうまくできません

    こんにちは。Perl初心者です。みなさんのお力をお借りしたく、初めて投稿させていただきました。よろしくお願いします。 現在、ファイルから特定した行を抽出し、その行に含まれる文字列を抽出しようとしているのですが、その文字列の抽出がうまくできません。 <文字列を含むファイル:xxx.txt> -------------------------- To 鈴木 太郎さん 1行目 : 01,りんご, 3 個, ナシ, 1個 14行目 02,キャベツ, 3 個, なす, 10本 15行目 : -------------------------- <スクリプトファイル:yyy.pl> -------------------------- open(DAT, "./xxx.txt") || die("can't open file : ($!)"); @file = <DAT>; close DAT; if ( $file[0] =~ /(\W+\s)(\W+)/ ) { print "$1\n"; } print "$file[13]\n"; print "$file[14]\n"; -------------------------- <結果> -------------------------- 鈴木 -------------------------- 抽出したい結果は「鈴木 太郎」なんですが、上記のような結果(「1byteのスペース」鈴木「2byteのスペース」)になってしまいます。xxx.txtの「To」と「鈴木」の間と、「鈴木」と「太郎」の間にはそれぞれ1byteのスペースがあります。どうやったら「鈴木 太郎」と抽出できるか教えてください。 スクリプトは「Copal2(ver2.77)」というツールを使って作りました。そのツールではエンコードは「自動判別」となっており実際何が使われているのか分かりません。 また他にも質問があります。 今抽出したい行を指定して出力させてますが、 「To」から始まる行 「01」といった2桁の数字から始まる行 というような抽出の仕方をしたいのですが可能でしょうか? 本当に初心で大変恐縮ではありますが、教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Windowsのバッチファイルを利用しtxtファイルの指定のした位置に文字を追加する方法

    現在、下記内容のファイル(test.txt)指定した行に指定文字を追記できる方法を探しております。 【test.txt内容】 [test1] :::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: [test2] [test4] :::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: [test5] :::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: end 【追記したい内容】 test.txtの"[test2]"行の下の行に以下の文字を追記したいです。 [test3] :::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: 指定行に追記するというコマンド自体はないと思い、batやwshの本などを読んではいるのですがなかなか良い考えが浮かびません。 ご教示の程よろしくお願いいたします。

  • 2つのファイルを用いた文字列置換(削除)の方法

    こんにちは。 テキストファイルA.txtに、検索したい文字列を1行ずつ入れておき、別のテキストファイルB.txtのうち、A.txtにある文字が含まれている行を削除するという作業をしたいです。 例えば A.txt AAA BBB B.txt hoge hogeAAAhoge hogeBhoge hogeBBBhoge の場合、 hoge hogeBhoge を出力させたいです。 このような処理ができる方法はないでしょうか?(コマンドやプログラム等)

  • Solarisのawkでの正規表現の使い方について

    ご存知でしたら、教えてください。 Solarisのawkで、変数に対しての比較に正規表現が使えないのですが、 よい方法をご存知の方がいましたら、教えて下さい。 nawkなら、上手くいくのですが、awkでは無理なのでしょうか? また、Linuxのawkなら、上手くいきました。 よろしくお願いします。 例)下記の場合、./test.shを実行すると、test.awkの正規表現を使用している部分[if ( $7 ~ HENSU )] でエラーになってしまいます。 --------------------test.shの中身-------------------- #!/bin/sh HENSU="3A" cat testdt.txt | \ awk -f test.awk HENSU=${HENSU} exit 0 ----------------------------------------------------- --------------------testdt.txtの中身-------------------- aaaaa bbbb ccc ddd eeeee ffffff gg3Aggggg hhhhhhh iiiii aaaaa bbbb ccc ddd eeeee ffffff gggggggg hhhhhhh iiiii aaaaa bbbb ccc ddd eeeee ffffff gggggggg hhhhhhh iiiii ----------------------------------------------------- --------------------test.awkの中身-------------------- BEGIN{ FS="\t" } { if ( $7 ~ HENSU ) { print $0 } } -----------------------------------------------------

  • バッチファイルで文字列を順番問わずマッチさせたい

    バッチファイルで、2個以上の文字列を順番問わずマッチさせたいと考えています。 例えば、 「111 222 333 444 555 666 777」 という内容のテキストファイルがあったとして、 sedコマンドを使って 「222」と「444」と「666」が この順番で含まれている行を置換したい場合、 sed -e "s/.*222.*444.*666.*/置換後の文字列/" in.txt > out.txt とすれば、問題なく置換されると思います。 しかし、上記の例では、 「777 666 555 444 333 222 111」 という内容のテキストファイルは置換されません。 文字列の順番を問わず、 「222」と「444」と「666」が含まれている行ならば、 その行を置換する、といった事は出来ないでしょうか。 sedコマンド以外でも構いませんので、何かいい方法をご存知の方がおられましたらお教え頂けないでしょうか。

  • batやvbsでテキストファイルの何行目に指定の文字を追記する方法

    現在、下記内容のファイル(test.txt)指定した行に指定文字を追記できる方法を探しております。 【test.txt内容】 [test1] :::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: [test2] [test4] :::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: [test5] :::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: end 【追記したい内容】 test.txtの"[test2]"行の下の行に以下の文字を追記したいです。 [test3] :::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: 指定行に追記するというコマンド自体はないと思い、batやwshの本などを読んではいるのですがなかなか良い考えが浮かびません。 ご教示の程よろしくお願いいたします。

  • DOSコマンドでの文字列操作

    DOSコマンドについての質問です 001.txt というファイルがあり、 ファイルの内容は以下のように、 日時とTEL番号が、記載されています 以下001.TXTの内容 -------------------------------------- 20120202103024035555333301 20120203023015034444222202 20120302012433033333111103 20120410231455032222999904 20120522210427031111888805 -------------------------------------- これを、日付、時間、電話番号、Seq番号ごとに、 ダブルクォーテーションでくるんで 以下のように、ファイルに出力したいのですが、 うまくいきません。 どのようなコマンドを作成すればよいでしょうか? -------------------------------------- "20120202","103024","0355553333","01" "20120203","023015","0344442222","02" "20120302","012433","0333331111","03" "20120410","231455","0322229999","04" "20120522","210427","0311118888","05" --------------------------------------

  • ファイルをある文字列で分割したいです。

    数百MBの1つのログファイルがあります。 これを月ごとのファイルに分割しようと思ってます。 大きすぎて既存環境のviでは開けないので、コマンドやスクリプトで分割しようと考えてます。 とりあえず今年の3月(Mar)~7月(Jul)と5つ月ファイルに分割できればいいです。 perlで1行ずつチェックしようかと思ってましたが、 間違いなくもっと簡単に処理できるかと思い投稿しました ^ ^;; シェルはcshです。 よろしくお願いいたします。

専門家に質問してみよう