• ベストアンサー

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

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

  • Perl
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

コマンドラインオプション -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は、この場合は $_ という変数に入っている値になります。

vivi0303
質問者

お礼

ありがとうございました。大変参考になりました。^^

その他の回答 (1)

回答No.2

「コマンドラインで」という限定になると結構面倒な事になります。 例えば、 echo "aaa,bbb,ccc" | awk -F"," '{ printf( "%s:%s\n", $1, $2 )}' をperlのコマンドラインで”同じ意味合い”で再現しようとすると perl -e "@a = split(\",\",\"aaa,bbb,ccc\");print \$a[0] . \":\" . \$a[1] . \"\\n\";" という感じになりますw #同じ意味合い・・","で分けた1つ目と2つ目を":"でつなげて出力 $1,$2を使う形だとこんな感じです。 perl -e "\$buff = \"aaa,bbb,ccc\";\$buff =~ s/^(.*?),(.*?),(.*?)\$/\$1:\$2/;print \"\$buff\n\";" #正規表現を使った形です。 perlはあくまでもプログラム言語なので、実装の制限(例えば、返り値を変数に入れてからしか使えないとか)や 機能が汎用的であるが故に、利用するには手続きがいるなど コマンドラインで実行しようとするとどうしても機能特化した UNIXコマンドには負けてしまいがちです。 ただし、awkコマンド自体はプログラムですから 当然perlでも同様のプログラムを作る事ができます。 ########################## パンは、小麦粉から作られている。 当然小麦粉よりもパンの方がおいしい。 でも、パンからうどんは作れないけど 小麦粉からうどんは作れる。 要するに、パン(awk)という特化したものはそれ単体で見ると 優れていて、汎用的な小麦粉は勝てないが パンからうどんという特化したものを作る事はできない。 しかし、小麦粉はうどんを作る事ができる(謎)

vivi0303
質問者

お礼

ありがとうございます。なるほど。難しいですね。 おっしゃっていることは分かりました。^^

関連するQ&A

  • awkの使い方について教えてください。

    awkとperlなどの初心者です。 使い方が分かっていないのですが、 例えば出力のフィールドセパレータを,に変更するには どうすればいいでしょうか? awk '{OFS=,;print}' fileなどとやってみますが、 うまくいきません。2つ以上のコマンドを実行するときの 文法がわかっていないような気がするのですが。 あとperlでよくみかけるperl -neのnは何でしょうか? man perlとやってみても-wと-eの意味しかのっていなくて なからないのですが。ご教授下さい。

  • awkのフィールド数制限について質問です

    ご存知の方がいましたら、教えて下さい。 SunOS5.8でawkコマンドを実行すると、 1レコードが100フィールドを超えると、 「フィールド指定が多すぎます」のエラーがでるようなんですが、 SunOS5.8のawkは、1レコードが100フィールドまでした対応してないんでしょうか? また、nawkの場合の1レコードのフィールド数制限はあるのでしょうか? もし、パッチなどをあてて対応できるんであれば、教えて下さい。 よろしくお願いします。

  • awkコマンドについて

    教えてください。 Solaris9を使用しています。 SYSTEM Vでawkコマンドを使用しているシェルをSolaris9上で実行すると awk: レコード `従業員番号 従業員氏名 ...' においてフィールド指定が多すぎます。 のMSGが表示されてしまいます。 Solaris9では、1レコードの長さやフィールド数に制限があるのでしょうか? 行っている処理はテキストファイルのタブをカンマに変換です。 SYSTEM V上では正常に動作します。 よろしくお願いします。

  • awkについて

    度々すみません。awkについて先程教えて頂いたものですが、少し変更しようと思っているのですが上手くいきません。変更していることは、以下の○○○の内容を固定ではなくてコマンドラインから渡したいです。 ウェブで調べたところARGVというのを使うことはわかりました。そこで"○○○"からARGV[0]に変更してコマンド実行時に引数を与えたのですが、「○○○というファイルを開けません」というエラーになってしまいます。実行したのはawk -f awk data.csv ○○○です。なぜ引数をファイル名だと認識してしまうのでしょうか。初歩的で申し訳ありませんが教えて下さい。 BEGIN{ goukei = 0 count = 0 } { #フィールドの8番目の条件が一致する場合のみ9番目を合計 if($8=="○○○"){ goukei += $9 count++ } } END{ if(count!=0){ print "合計は", goukei print "平均は", goukei/count } else{ print "条件に一致するのない” } }

  • awkについて

    UNIXのawkコマンドにて、レコードを抜き出したいのですが、その時抜き出した各レコード毎に改行 をいれたいのですが、下記のような定義で問題ないでしょうか? awk -f PGMファイル 元データファイル > 抜き出したデータファイル PGMファイル は下記です。 BEGIN{ORS=\"\\n\"}  ←改行でいいんでしょうか? { if(substr($0, 5, 1) == \"1\"){ if(substr($0, 6, 2) == \"2\"){ print substr($0, 1,138) } } }

  • awkで計算した結果を反映させる方法

    初心者です。おしえてください。 awkで次のようなことをするにはどうすればよいでしょうか? コーディング例を教えてください。 テキストファイルのレコードの一部が数値項目で、 その数値項目から3を引いた結果をその数値項目に置換えたいです。 (区切り文字がない1レコードのみが入ったテキストファイルを読み込みます。) 例) aaaaa10000bbbbb20000 6~10カラムの「10000」から-3をした「9997」を置き換えて、 aaaaa09997bbbbb20000 としたいです。 awkで無くても、Unix(HP-UX)のコマンドやBシェルで可能であれば、 構わないのでおしえてください。 よろしくお願いいたします。

  • awkのsplitについて

    awkにつて質問いたします。 awkで項目を特定する時$1等指定しますが、最大で$199までしか対応していない事が分かりました。 そこでawk内部でsplitを使う事にしました。(この場合、200項目目以上可能) 項目の特定、変更は分かりましたが、レコード単位での出力("print 配列"等)の方法分かりません。 簡単に言いますと、 1.あるレコードのある項目を変更したい 2.変更後、レコード単位でファイルに出力したい ※項目は区切り文字で仕切られている ※項目は200以上ある です。 for文で回すのは最終手段にしたいと考えています。 ※この方法でしたら、実現しています。 ご存知の方、ご教授願えますか? 宜しくお願いいたします。

  • awkで複数ファイルを入力した場合を教えてください。

    man awkとしたとき引数がfile...となっていたので 複数のファイルを引数にとれるのかなと思ったのですが その場合$1などフィールドを参照するときはどうなるのでしょうか?

  • perl 積算の仕方が解らない

    フォートランで作られたデータを、perlで作り直そうと始めました。 なんとか、perlの中で値の計算までは出来たのですが、 下記データの2フィールド目に対して積算の仕方が解りません。 awkでは、awk '{SUM += $2;printf("%s %10.4e\n", $1, SUM)}'でできましたが、 perlで中ではどのようにするのか? 1998-04-20T16:16:00   6.533078e+05 1998-05-01T01:59:00   1.501809e+06 1998-05-05T07:20:00   7.202719e+05 1998-05-05T07:24:00   9.799618e+05 ついでに、御存じでしたら、御教授ください。 awkとperlの計算結果は全く同じにでましたが、フォートランの結果は 下記のように微妙に違ってしまう処がございます。 それは、どうしてでしょうか?     awk,perl の結果    フォートランの結果   フォートランの7ケタの結果  7.202719e+05      7.202718e+05      7.2027181e+05          9.799618e+05     9.799616e+05 9.7996169e+05 以上 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • PerlとUnixの関係

    現在、Perlを勉強しているものです。バッチプログラムやVBScriptを使って、コマンドラインで便利に開発するようにしています。近々PCを購入し、UNIXでの開発をしようとおもっています。その際には、シェルプログラムなるものを覚えて便利に開発したいなあとおもっています。 話はそれますが、私はコンピュータ専門書籍の本屋さん(名古屋で一番の品数があるとおもわれます)に勤めているのですが、返品の棚にやや古めの「Unix&Perl」みたいな題名の本がありました。 本題に戻りますが、UnixではPerlをコマンドラインの機能の一部としてつかえたりするのですか?Windowsだとバッチプログラムで足りないところはJScriptやVBScriptで補ったりしなくてはならないのですが、Unixのシェルではその役目はPerlが果たしてくれたりすることがあるんでしょうか?要するに、シェルプログラムの機能強化としてPerlを使えたりするのでしょうか? あと、これは本題とは関係ないのですが、Unixを入れるならばFreeBSDやSoralisなどがあるみたいですが、どのディストリビューション?を選択すれば一番いいとおもいますか? 分かる方、回答をお願いします。よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう