• 締切済み

【perl】重複した要素だけを書き出すスクリプト

perlでスクリプトを作っているのですが、 あるリストから重複した要素だけを取り出すってのを 作りたいのですがうまく出来ません。 あるリストの例 a-a:0001 a-b:0002 a-c:0003 a-d:0004 a-b:0002 a-e:0005   ・   ・   ・ この場合 a-bだけを取り出したいんですが躓いています。 ご回答お願いします。

みんなの回答

  • iriyak
  • ベストアンサー率48% (40/82)
回答No.2

そうですね。a2p(1) で Perl スクリプトの生成にトライしてみました。お役立てください。 zebra[Mon]$ cat test.awk BEGIN { FS = ":" } { Assoc[$2] = $1 Occur[$2]++ } END { for (i in Occur) if (Occur[i] > 1) print Assoc[i] } zebra[Mon]$ a2p test.awk > test.pl zebra[Mon]$ cat test.pl #!/usr/local/bin/perl eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' if $running_under_some_shell; # this emulates #! processing on NIH machines. # (remove #! line above if indigestible) eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift; # process any FOO=bar switches $, = ' '; # set output field separator $\ = "\n"; # set output record separator $FS = ':'; while (<>) { ($Fld1,$Fld2) = split(/[:\n]/, $_, -1); $Assoc{$Fld2} = $Fld1; $Occur{$Fld2}++; } foreach $i (keys %Occur) { if ($Occur{$i} > 1) { print $Assoc{$i}; } } zebra[Mon]$ perl test.pl input.txt a-b

  • iriyak
  • ベストアンサー率48% (40/82)
回答No.1

こんにちは。 Perl の代わりに Awk でトライしてみました。(FreeBSD 5.4-Release-p4 上の awk にて) 連想配列 (Associative Array) を二つ用意するところがポイントです。Perl でも簡単に書き下せるでしょう。 zebra[Mon]$ awk -V awk version 20040207 zebra[Mon]$ cat input.txt a-a:0001 a-b:0002 a-c:0003 a-d:0004 a-b:0002 a-e:0005 zebra[Mon]$ awk -F: '{ Assoc[$2] = $1; Occur[$2]++ } END { for (i in Occur) { if (Occur[i] > 1) { print Assoc[i] } } }' input.txt a-b zebra[Mon]$

masailove
質問者

お礼

ありがとうございました。 awkというのはよくわからないんで perlで作ってもらうことは可能でしょうか? 出来ればハッシュを使って

関連するQ&A