teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コンバータについて補足

2018/06/28 04:28

投稿

KojiDoi
KojiDoi

スコア13727

answer CHANGED
@@ -14,4 +14,16 @@
14
14
  項目がアルファベット順に並ばないのが気持ち悪いなら
15
15
  ```
16
16
  perl -F"," -ane '$n{$F[2]}++; END{foreach $k (sort keys %n){print "$k $n{$k}\n"}}' data.csv
17
- ```
17
+ ```
18
+
19
+ # perlスクリプトファイルを作る簡便な方法
20
+
21
+ コメント欄にも書きましたが、こちらに補足しておきます。
22
+ まず、perlスクリプトファイルの呼び出し方。ワンライナーで対処しているうち、より複雑なことをやりたくなって結局スクリプトファイルの作成を始めるという事態はままあることです。その場合、ワンライナー部分を単純に新規ファイルにコピーし、コマンドラインのワンライナー部分をそのファイル名に置き換え、最後にコマンドラインの`-e`を消すだけです。awk では逆に`-f`をつけなければなりませんがperlは異なります。
23
+
24
+ 次に、perlのパッケージの中に標準で含まれているコンバータがあります。
25
+ awkはわかるけどperlはちょっと、という回答者氏のような方は、awkスクリプトをperlスクリプトに変換する`a2p`というコンバータを使えば、簡単にperlスクリプトファイルを得ることができます。同様に、sedスクリプトをperlスクリプトに変換する`s2p`、findコマンドと同じことをするperlスクリプトを生成する`find2perl`があります。
26
+
27
+ 私は個人的にはa2pやs2pはほとんど使いませんが、find2perlはちょくちょく使います。「ディレクトリを下までたどりながら、条件に合うファイルが見つかったらそこそこ複雑な何らかの処理を行う」という作業にはとても便利です。find2perlを覚えてしまうと、findやxargsを使ったシェル芸など、まだるっこしくて覚える気にはならないくらいです。
28
+
29
+ 参照: http://perldoc.jp/docs/perl/5.10.1/perlutil.pod

1

addition

2018/06/28 04:28

投稿

KojiDoi
KojiDoi

スコア13727

answer CHANGED
@@ -1,4 +1,17 @@
1
1
  まずawk互換モードから覚えるといいでしょう。
2
2
  ```sh
3
3
  $ perl -F"," -ane 'print "$F[2]\n"' data.csv |sort |uniq -c
4
+ ```
5
+
6
+ カウントを取りたいだけならuniqは必要ありませんね。
7
+ ```
8
+ # awk
9
+ awk -F"," '{n[$3]++}END{for(i in n){print i,n[i]}}' data.csv
10
+ # perl
11
+ perl -F"," -ane '$n{$F[2]}++; END{foreach $k (keys %n){print "$k $n{$k}\n"}}' data.csv
12
+ ```
13
+
14
+ 項目がアルファベット順に並ばないのが気持ち悪いなら
15
+ ```
16
+ perl -F"," -ane '$n{$F[2]}++; END{foreach $k (sort keys %n){print "$k $n{$k}\n"}}' data.csv
4
17
  ```