質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

4回答

3961閲覧

AWKからPerlへの変換で困っています

sheng

総合スコア8

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2018/06/27 12:54

編集2018/06/27 15:05

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

ernix

総合スコア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

bunzaemon

総合スコア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

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sheng

2018/06/27 15:04

ご回答ありがとうございます。 説明が不足しておりました。申し訳ございません。 perl test.pl data.csv 3 のように、ワンライナーではなく、perlスクリプトにて処理したいと思っております。何卒よろしくお願い致します。
otn

2018/07/25 11:15

'~~’ の部分がスクリプトです。
guest

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を使ったシェル芸など、まだるっこしくて覚える気にはならないくらいです。

参照: http://perldoc.jp/docs/perl/5.10.1/perlutil.pod

投稿2018/06/27 13:47

編集2018/06/28 04:28
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sheng

2018/06/27 15:04 編集

ご回答ありがとうございます。 説明が不足しておりました。申し訳ございません。 perl test.pl data.csv 3 のように、ワンライナーではなく、perlスクリプトにて処理したいと思っております。何卒よろしくお願い致します。
KojiDoi

2018/06/27 15:34

ワンライナーで書いた部分をファイルに書きこんでperl -F "," -an test.plとするだけです。 引数を取りこみたいなら@ARGVを使って下さい。
KojiDoi

2018/06/27 17:13

a2pというツールが在ったことを忘れていた。awkスクリプトファイルを既にお持ちならこれを試してみては如何?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問