perlが馴染めず、awkでなんとかしていたのですが、汎用的なプログラムを作る必要があり、質問させていただきました。
data.csv
No |var1|var2|var3|
|:--|:--:|--:|
|1|10|A|1000
|2|10|B|1000
|3|10|B|2000
|4|10|A|2000
|5|10|A|1000
cat data.csv | awk -F ',' `{print $3}' | sort | uniq -c によって、下記の結果が得られます。
3 A
2 B
これをawkではなく、perlで列数とファイルを指定して同じような結果を得るperlプログラムを作成したいです。
perl test.pl data.csv 3
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
#!/usr/bin/perl use strict; use warnings; my ($file, $colnum) = @ARGV; my %stash; open my $fh, '<', $file or die "Can't open $file: $!"; while (my $line = <$fh>) { my @cols = split /,/, $line; my $var = $cols[$colnum - 1]; $stash{$var}++; } close $fh or die "Can't close $file: $!"; my @summary = sort { $b->[1] <=> $a->[1] } map { [$_, ($stash{$_} || 0)] } keys %stash ; for my $row (@summary) { printf "%d %s\n", reverse @{$row}; } 1;
投稿2018/07/25 06:56
総合スコア20
0
汎用的な、というのがどの程度を言っているのか分りませんが、
perl
1#!/usr/bin/env perl -F, -lan 2use vars qw($c %h); 3BEGIN{ $c = ( pop @ARGV ) - 1} 4 $h{$F[$c]} ++ 5}{ 6 print "$h{$_} $_" for keys %h ;
これを保存して実行すれば、望みの形にはなります。
本格的なスクリプトを作りたいのであれば、
bash
1$ perl -MO=Deparse THIS.pl data.csv 3
で、内部解釈を文字列化して、そこからスクリプトを作成してください。
私のスクリプトが使いずらいと感じたら、先の御二方のワンライナーを同様の手段でスクリプト化して、
改造するのが良いでしょう。
投稿2018/07/01 05:11
総合スコア118
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Perlはあまり詳しくないですが、
Bash
1perl -nle '@a=split(/,/,$_);$b{$a[2]}++;END{foreach $i(keys %b){print "$b{$i} $i"}}' data.csv
投稿2018/06/27 14:13
総合スコア84557
0
まずawk互換モードから覚えるといいでしょう。
sh
1$ perl -F"," -ane 'print "$F[2]\n"' data.csv |sort |uniq -c
カウントを取りたいだけならuniqは必要ありませんね。
# awk awk -F"," '{n[$3]++}END{for(i in n){print i,n[i]}}' data.csv # perl perl -F"," -ane '$n{$F[2]}++; END{foreach $k (keys %n){print "$k $n{$k}\n"}}' data.csv
項目がアルファベット順に並ばないのが気持ち悪いなら
perl -F"," -ane '$n{$F[2]}++; END{foreach $k (sort keys %n){print "$k $n{$k}\n"}}' data.csv
perlスクリプトファイルを作る簡便な方法
コメント欄にも書きましたが、こちらに補足しておきます。
まず、perlスクリプトファイルの呼び出し方。ワンライナーで対処しているうち、より複雑なことをやりたくなって結局スクリプトファイルの作成を始めるという事態はままあることです。その場合、ワンライナー部分を単純に新規ファイルにコピーし、コマンドラインのワンライナー部分をそのファイル名に置き換え、最後にコマンドラインの-e
を消すだけです。awk では逆に-f
をつけなければなりませんがperlは異なります。
次に、perlのパッケージの中に標準で含まれているコンバータがあります。
awkはわかるけどperlはちょっと、という回答者氏のような方は、awkスクリプトをperlスクリプトに変換するa2p
というコンバータを使えば、簡単にperlスクリプトファイルを得ることができます。同様に、sedスクリプトをperlスクリプトに変換するs2p
、findコマンドと同じことをするperlスクリプトを生成するfind2perl
があります。
私は個人的にはa2pやs2pはほとんど使いませんが、find2perlはちょくちょく使います。「ディレクトリを下までたどりながら、条件に合うファイルが見つかったらそこそこ複雑な何らかの処理を行う」という作業にはとても便利です。find2perlを覚えてしまうと、findやxargsを使ったシェル芸など、まだるっこしくて覚える気にはならないくらいです。
投稿2018/06/27 13:47
編集2018/06/28 04:28総合スコア13671
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/27 15:04 編集
2018/06/27 15:34
2018/06/27 17:13
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。