• 締切済み

【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

  • Pythonでリストの要素の順番を入れ替え、結合したい

    Pythonでリストの要素の順番を入れ替え、結合したい 以下のようなリスト(入力list)があります。"1"もしくは"2"が出てきたら、それぞれ次の要素と順番を入れ替え、かつ1つの要素に結合するスクリプトを書きたいのですが、案はありますでしょうか。以下の出力listのような出力を望んでいます。 入力 list=['a', 'b', '1', 'c', 'd', 'e', '2', 'f', '2', 'g'] 出力 list=['a', 'b', 'c1', 'd', 'e', 'f2', 'g2'] 1や2が出てくる回数はリストにより異なり、また1より2の方が先に出てくる場合もあります。またリストによっては1がない場合、2がない場合もあります。(ただし '1', '2' のように1と2が連続で出てくることはありません。かならず間に別の要素が入ります) indexを使って要素の順番の入れ替えはできるようなのですが、最初に出てきたものしかとらえないので、例えば上の例でいうと2,gがg2に変換されません。また結合もできていませんが、indexを使った入れ替え方法を一応以下に記しておきます: i=list.index("1") j=list.index("2") list[i],list[i+1]=list[i+1],list[i] list[j],list[j+1]=list[j+1],list[j] とすると、出力リストは['a', 'b', 'c', '1', 'd', 'e', 'f', '2', '2', 'g']となります。 (最後のg2が変換できていない。また結合もできていない) Python初心者です。よろしくお願いします。

  • 配列要素へのリファレンスと、要素の追加・削除について

    ActivePerl v5.8.8 build 820 を使用しています。 配列要素へのリファレンスを取得し、その後要素の追加又は削除を行った場合 元の要素を参照し続けます。 (1) 要素の追加 @list = qw/a b c d/; $p = \$list[1]; print("$$p\n"); splice(@list, 1, 0, 'x'); print("$$p\n"); # 'b' が表示される # $list[2] を参照 ($list[1] ではない) (2) 要素の削除 @list = qw/a b c d/; $p = \$list[1]; print("$$p\n"); splice(@list, 1, 1); print("$$p\n"); # 'b' が表示される 質問1 これは perl の仕様としての動作でしょうか? それとも、実行系やバージョン などの環境に依存するものでしょうか? 質問2 要素の削除の場合、削除直後なのでたまたま元の値が表示されただけで、 削除した要素 'b' が格納されたメモリ空間はいつ上書きされるかわからない 状態なのでしょうか? それとも、上書きされることはないのでしょうか?

    • ベストアンサー
    • Perl
  • 配列から別の配列の要素を削除する方法

    ある配列array_aに、100件の文字列要素が格納されています。 別の配列array_bには、80件の文字列要素が格納されています。 array_aの要素、array_bの要素共に重複するものはありません。 array_b中に存在する要素はすべてarray_a中にも存在します。 array_aにあり、array_bにはない要素で構成されたarray_cの作り方を教えてください。 例えば $array_a=array("a","b","c","d","e","f","g"); $array_b=array("e","b","d"); なら、 $array_c=array("a","c","f","g") になります。 配列array_aとarray_bは、 $array_b=array("b","b","d"); であったり、 $array_a=array("a","a","b","c","d","e","f","g"); といった「重複する要素を含むパターン」はありません。要素はすべてユニークです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • perlについて

    my @a = qw(a b c); my @b = ( qw(e f g) ); これの違いは何なのでしょうか? perlにおいて()で囲むのはリストとして扱うということなのでしょうが、いまいちよく分かりません。 教えてください

    • ベストアンサー
    • Perl
  • 【エクセル】重複データ抽出時にうまくいかない

    エクセル2003で、[データ]→[フィルタ]→[フィルタオプションの設定]で下記のように 設定して重複データを省きました、 ・「指定した範囲」にチェック ・「リスト範囲」に$A$1:$A$13を入力。 ・「抽出範囲」に$B$1を入力 ・「重複するレコードは無視する」にチェック の条件で実行すると。 [元データ]  A列 1 a 2 a 3 b 4 b 5 c 6 c 7 c 8 d 9 d 10 d 11 e 12 e 13 e が [フィルタ実行後]  A列  B列 1 a  a 2 a  a 3 b  b 4 b  c 5 c  d 6 c  e 7 c 8 d 9 d 10 d 11 e 12 e 13 e の様にB列でaが2つ出てしまいます。 なにが原因でしょうか?

  • 重複は無効の意味って?

    サッカーWC杯のチケットの販売規約で 重複当選は、無効と書いてありました。いろいろ似た質問があるのですが、もう少し詳しく教えて下さい。 同じゲームを申し込む(カテゴリーの話はおいといて) AがB,C,Dを同行者として申し込む BがC,D,Aを同行者として申し込む この場合片方が当選した場合、重複申込として キャンセルされるんでしょうか? また、 AがB,C,Dを同行者として申し込む BがC,D,Eを同行者として申し込む ではどうでしょうか? 仮に両方当選した場合、 1,全員無効 2,片方(A,B,C,D)のみ当選 3,重複分無効(A,B,C,D,Eが1枚づつ当選) あと、海外の申込の場合、日本の試合でもパスポートが 必要なんでしょうか?よろしくお願いします。

  • perlで配列の要素が空なのを知るには?

    教えてください。 例えば、perlの次の様な要素が3つある配列で、 @t = ('A',,'C'); 2要素目が空で有ることを判別したいのですが、どうしたら良いでしょうか?

    • ベストアンサー
    • Perl
  • Excelの重複列の削除について

    Excelの重複列の削除について質問があります。 下記のような場合、B、E列を削除しA、C、D列を残したいのですが ご教授いただけないでしょうか? 宜しくお願いします。 A 123 → A 123 B 123   C 456 C 456   D 789 D 789 E 789

  • 重複を無くしたい

    データをDBから読み込み、一週間分のリストを作っています。 | 03/20(日) a1 | | 03/21(月) b1 | | 03/22(火) c1 | | 03/23(水) d1 | | 03/24(木) e1 | | 03/25(金) f1 | | 03/26(土) g1 | と表示させたいです。a1~g1には文字が入ります。 一日にa1、a2、a3と複数のデータが入るときもあります。 表示すると | 03/20(日) a1 | | 03/20(月) a2 | | 03/20(火) a3 | | 03/21(水) b1 | | 03/22(木) c1 | | 03/23(金) d1 | | 03/24(土) e1 | となってしまいます。 日付が重複した時にスキップして次の日付に 移すのはどうすればよいのでしょうか。

    • ベストアンサー
    • PHP
  • 配列の重複削除について

    配列の重複削除について教えて下さい。 普通の重複チェックとは違い、3つの配列 それぞれに値があり、添え字が0から同じ ように始まり、3つの配列が全て同じものは、 例えば、 配列A[2]='30' 配列B[2]='000' 配列C[2]='1' 配列A[4]='30' 配列B[4]='000' 配列C[4]='1' は、1つの添え字にまとめたい。 その3つが一致したもの重複をまとめたいのと、 新しく出た3つの値は残したいのです。 つまり、以下のように抽出したいのです。 何か良い方法があれば教えて下さい。 perlで作成しています。 注)配列Cは空白もあります。 配列A( 10, 20, 30, 10, 30, 20) 配列B(000,010,000,010,000,000) 配列C(  , 0, 1, 0, 1, 1) ↓ 配列D( 10, 20, 30, 10, 20) 配列E(000,010,000,010,000) 配列F(  , 0, 1, 0, 1)

    • ベストアンサー
    • Perl

専門家に質問してみよう