【復活求む!】惜しくも解散してしまったバンド|J-ROCK編

菊池と申します。
perlスクリプトで下記のような文字列を検索し、検索されたら指定したフィールドの値を変数に入れたいのですが、grepやawkを使うと、ファイル中のすべてが検索対象になってしまい困っております。
文字列検索の表現方法をご教授頂けると大変助かります。
下記へperlスクリプトの一部を記載させて頂きました、データはcsv形式です。
変数に入れる事が出来なかったので、抽出した値をファイルへ出力させています。

検索文字列=2013/11/19,09:00:00,13:00:00
データの中味
<94>N/<8c><8e>/<93>ú,<89>ð<90>Í<8a>J<8e>n<8e><9e><8d><8f>,<89>ð<90>Í<8f>I<97>¹<8e><9e><8d><8f>,<8c>ö<8b>¤<8d>À<95>WX(m),<8c>ö<8b>¤<8d>À<95>WY(m),<95>W<8d><82>H(m),<88>Ú<93>®<95>½<8b>Ï<92>lX(m),<88>Ú<93>®<95>½<8b>Ï<92>lY(m),<88>Ú<93>®<95>½<8b>Ï<92>lH(m),<8f><89><8a>ú<92>l<82>©<82>ç<82>Ì<95>Ï<93>®<97>ÊX(m),<8f><89><8a>ú<92>l<82>©<82>ç<82>Ì<95>Ï<93>®<97>ÊY(m),<8f><89><8a>ú<92>l<82>©<82>ç<82>Ì<95>Ï<93>®<97>ÊH(m),2D<8b><97><97>£(m),3D<8b><97><97>£(m),<88>Ú<93>®<95>½<8b>Ï2D<8b><97><97>£(m),<88>Ú<93>®<95>½<8b>Ï3D<8b><97><97>£(m),<91>ª<88>Ê<83>t<83><89><83>O,<91>ª<88>Ê<90>¸<93>x,<88>Ù<8f>í<92>l<83>t<83><89><83>O<81>i<8f><89><8a>ú<92>l<81>j,<88>Ù<8f>í<92>l<81>i<8c>x<89>ú<83><89><83><93><83>N<81>j,<94>ò<82>Ñ<92>l<83>t<83><89><83>O,
2013/11/18,01:00:00,05:00:00,-68213.2327,17746.2653,2093.7982,-9999.0000,-9999.0000,-9999.0000,5.0099,-0.5989,-4.8100,16215.1100,16255.8006,-9999.0000,-9999.0000,4,0.0019,0,0,0,
2013/11/18,05:00:00,09:00:00,-68213.2273,17746.2666,2093.7872,-9999.0000,-9999.0000,-9999.0000,5.0153,-0.5976,-4.8210,16215.1061,16255.7959,-9999.0000,-9999.0000,4,0.0014,0,0,0,
2013/11/18,09:00:00,13:00:00,-68213.2256,17746.2692,2093.7792,-9999.0000,-9999.0000,-9999.0000,5.0170,-0.5950,-4.8290,16215.1030,16255.7923,-9999.0000,-9999.0000,4,0.0016,0,0,0,
2013/11/18,13:00:00,17:00:00,-68213.2236,17746.2737,2093.7682,-9999.0000,-9999.0000,-9999.0000,5.0190,-0.5905,-4.8400,16215.0981,16255.7866,-9999.0000,-9999.0000,4,0.0014,0,0,0,
2013/11/18,17:00:00,21:00:00,-68213.2306,17746.2741,2093.7672,-9999.0000,-9999.0000,-9999.0000,5.0120,-0.5901,-4.8410,16215.1015,16255.7899,-9999.0000,-9999.0000,4,0.0016,0,0,0,
2013/11/18,21:00:00,01:00:00,-68213.2308,17746.2739,2093.7882,-9999.0000,-9999.0000,-9999.0000,5.0118,-0.5903,-4.8200,16215.1017,16255.7916,-9999.0000,-9999.0000,4,0.0016,0,0,0,
2013/11/19,01:00:00,05:00:00,-68213.2221,17746.2743,2093.8062,-9999.0000,-9999.0000,-9999.0000,5.0205,-0.5899,-4.8020,16215.0968,16255.7880,-9999.0000,-9999.0000,4,0.0017,0,0,0,
2013/11/19,05:00:00,09:00:00,-68213.2140,17746.2808,2093.7982,-9999.0000,-9999.0000,-9999.0000,5.0286,-0.5834,-4.8100,16215.0870,16255.7777,-9999.0000,-9999.0000,4,0.0013,0,0,0,
2013/11/19,09:00:00,13:00:00,-68218.2472,17746.8587,2098.6543,-9999.0000,-9999.0000,-9999.0000,-0.0046,-0.0055,0.0461,16217.2238,16258.2532,-9999.0000,-9999.0000,4,0.0017,0,0,1,
2013/11/19,13:00:00,17:00:00,-68218.2538,17746.8600,2098.6633,-9999.0000,-9999.0000,-9999.0000,-0.0112,-0.0042,0.0551,16217.2263,16258.2563,-9999.0000,-9999.0000,4,0.0014,0,0,1,
2013/11/19,17:00:00,21:00:00,-68218.2603,17746.8538,2098.6473,-9999.0000,-9999.0000,-9999.0000,-0.0177,-0.0104,0.0391,16217.2349,16258.2638,-9999.0000,-9999.0000,4,0.0016,0,0,1,
 
<<スクリプトの一部>>
#`grep "'2013/11/19,09:00:00,13:00:00'" $SS | awk -F"," '{print \$13}' $SS > $SS-2D`;
#`grep "'2013/11/19,09:00:00,13:00:00'" $SS | awk -F"," '{print \$14}' $SS > $SS-3D`;

`awk -F"," '\$1 ~ \/2013\/11\/19\/ && \$2 == \/09\:00\:00\/ {print \$13}' $SS > $SS-2D`;
`awk -F"," '\$1 ~ \/2013\/11\/19\/ && \$2 == \/09\:00\:00\/ {print \$14}' $SS > $SS-3D`;
以上 よろしくお願いいたします。

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

A 回答 (6件)

ん~.... 必要な要件が十分に書かれていない....



「grepやawkを使うと、ファイル中のすべてが検索対象になってしまい困っております」ってあるけど
・なにがどう「困る」のか, さっぱりわからない.
・ファイル中の「検索対象の部分」と「検索対象でない部分」を区別する方法がどこにも書かれていない.

ということで, とりあえずこれらを明確にしてください.

あと, 「変数に入れる」ってどういうことでしょうか? 該当するものが複数あったら, どうしたらいいんでしょうか?
    • good
    • 0

特定のフィールドだけをパターンマッチの対象にしたいということですか?


ならSplitで各フィールドをアレイに入れておいて、必要なアレイだけ比較対象にすればいいのでは。
    • good
    • 0

検索→変数


と言う意味がわかりません。
一行ごとに、配列のハッシュに代入して3次元のテーブルを作成した時点で、すでにひとつひとつのデータは変数として扱うことで出来ます。
@head = (<94>N/<8c><8e>/<93>ú,<89>ð<90>・・・【中略】・・・<9e>,・・)
@keys = (2013/11/18-01:00:00-05:00:00,2013/11/18-05:00:00^09:00:00,・・・)
$DATA{2013/11/18-01:00:00-05:00:00} = (-68213.2327,17746.2653,2093.7982,-9999.0000,-9999.0000,-9999.0000,5.0099,-0.5989,-4.8100,16215.1100,16255.8006,-9999.0000,-9999.0000,4,0.0019,0,0,0,
20)
あとは、それぞれのデータにアクセスすればよい。

この回答への補足

支離滅裂な文面で申し訳有りません
したい事は、2013/11/19,09:00:00,13:00:00<--左記の
文字列がデータファイル(csv形式)の中に記述されていたら、13列目と14列目の値を変数にセットしたいと言う事です。
上記文字列が記述されているのはデータファイルの中に1行しか有りません。
上記条件で得た、13列目と14列目の値と同じ列の値を比較して変動量を求めたいのです。
perlの超初心者です、perlはとても便利ですが、使いこなすまでに至っていません。
ご教授をよろしくお願いいたします。

補足日時:2014/02/21 17:23
    • good
    • 0

 Perlは、多次元のデータを扱えますが、それが配列とハッシュ(連想配列)です。

配列のハッシュとか、ハッシュの配列とか、ハッシュのハッシュとか・・
 あなたの場合、先に示したように、配列のハッシュにデータをすべて入れて、その要素にアクセスする方法が最も楽です。
 Perlを極めようとすると、"プログラミングPerl"は必携ですので、中古本でも良いので入手されたらいかがかと思います。
 プログラミングPerl(第3版)Volue1 の
9章データ構造
9.1 配列の配列
9.2 配列のハッシュ
9.3 ハッシュの配列
9.4 ハッシュのハッシュ
9.5 関数のハッシュ
9.6 より複雑なレコード
9.7 データ構造を保存する
 ですね。
 No.2さんが言われているようにsplitで、データをひとつのデータテーブルに入れて、あとは自在にキーなり、何番目かを取り出して比較なり処理すれば良いです。
    • good
    • 0

まだしたいことがよくわかりません。


追加のコメントのとおりのことをするのであれば、あなたのgrepやawkを使ったやり方で問題ないように思えますが(最初のGrep+Awkはパイプの使い方がちょっと間違っていると思いますが)、それでは不都合があるということなので、具体的にAwkやGrepでは何が都合が悪いのか書いてもらえればもっと回答がつくと思います。

この回答への補足

端末上で、
grep '2013/11/19,09:00:00,13:00:00' 入力ファイ名 | awk -F"," '{print $13}'を実行すると
16217.2238が得られるます。
grep '2013/11/19,09:00:00,13:00:00' 入力ファイ名 | awk -F"," '{print $14}'を実行すると、
16258.2532が得られるます。
16217.2238と16258.2532の値が欲しいのです。
perlの中で、grepとawkの使い方が出来てないのです。 grepやawkの使い方と上記値を抽出出来るperlの表現方法がお解りでしたら、ご教示してくださるとと大変助かりますが。
たどたどしい、文章でもうしわけありません。
よろしくお願いいたします。 

補足日時:2014/02/22 17:24
    • good
    • 0

こういうことですか?



while(<>){
chomp;
@temp = split(/,/ $_);
if(/2013\/11\/19,09:00:00,13:00:0/){
print "$temp[13]\n";
print "$temp[14]\n";
}

}
    • good
    • 0
この回答へのお礼

ご教示頂いた通りで出来ました。
皆様に暖かいご教示を頂けた事、大変感謝しております。本当に助かりました、有難うございました。

お礼日時:2014/02/22 22:18

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPerlで特定行から特定行までを抜き出したい

皆さんのお知恵をお貸し頂ければ幸いです。

Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。

example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================

上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。

それでは、どうぞよろしくお願い致します。

Aベストアンサー

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $flag = 0 }
  elsif ($flag) { print "$data\n" }
}
close FH;

で、もっと略したいPerlな人だとこんな感じ。Perl独特の記法がふんだんに使われているので、勉強するには不向きかもしれませんが^^;

open FH, "example.log" or die $!;
while (<FH>) {
  print if /^hogehoge$/ .. /^perl$/ and !/^(?:hogehoge|perl)$/;
}
close FH;

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $fl...続きを読む

Qperlでawkのようなことはできるでしょうか?

perlなど初心者です。
awkでレコードのフィールドを$1、$2などと参照できるのが便利だなと感じているのですが、perlでもコマンドラインで同じ事をするにはどうすればよいでしょうか?

Aベストアンサー

コマンドラインオプション -a (と-F)を使います。

perldoc perlrun
すると細かい説明がわかります。
-a
turns on autosplit mode when used with a -n or -p. An implicit
split command to the @F array is done as the first thing inside the
implicit while loop produced by the -n or -p.

perl -ane 'print pop(@F), "\n";'

is equivalent to

while (<>) {
@F = split(' ');
print pop(@F), "\n";
}

An alternate delimiter may be specified using -F.

@F という配列に入力行を分割して格納します。
awk でいうところの print $1, $2 は
print $F[0], $F[1], "\n";
になります。
配列が0オリジンになることに注意してください。
awkでの$0は、この場合は $_ という変数に入っている値になります。

コマンドラインオプション -a (と-F)を使います。

perldoc perlrun
すると細かい説明がわかります。
-a
turns on autosplit mode when used with a -n or -p. An implicit
split command to the @F array is done as the first thing inside the
implicit while loop produced by the -n or -p.

perl -ane 'print pop(@F), "\n";'

is equivalent to

while (<>) {
@F = split(' ');
print pop(@F), "\n"...続きを読む


人気Q&Aランキング

価格.com 格安SIM 料金比較