- ベストアンサー
perlでawkのようなことはできるでしょうか?
perlなど初心者です。 awkでレコードのフィールドを$1、$2などと参照できるのが便利だなと感じているのですが、perlでもコマンドラインで同じ事をするにはどうすればよいでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
コマンドラインオプション -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は、この場合は $_ という変数に入っている値になります。
その他の回答 (1)
- karumakaruma
- ベストアンサー率65% (65/100)
「コマンドラインで」という限定になると結構面倒な事になります。 例えば、 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)という特化したものはそれ単体で見ると 優れていて、汎用的な小麦粉は勝てないが パンからうどんという特化したものを作る事はできない。 しかし、小麦粉はうどんを作る事ができる(謎)
お礼
ありがとうございます。なるほど。難しいですね。 おっしゃっていることは分かりました。^^
お礼
ありがとうございました。大変参考になりました。^^