• ベストアンサー

Perlで文字列の操作がしたい

Perlで文字列の操作がしたい ---test.txt--- あ PC 100 a b c あ HIw 100 f g h あ HIw 100 あ sHI 130 z e i あ sHI 100 f p あ sHI 100 t p 以下、3000行程度続く(空白は、タブ区切り。) -------------- 上記のようなデータがあります。 比較したいのは、a b c(3列目以降のデータ)という部分になります。(実際は、10桁の英字列です) 処理は、 1行目のabcに該当する部分は全データの中で1行のみ必要。他の行は削除。 また、ここにデータが無い場合も削除。 それ以外は、保存。 順序は問わない。 というものです。説明が難しいので下記に例を挙げました。 --例-- あ PC 100 a b c <保存。 あ HIw 100 f g h <a,b,cのいずれも含まなず、空白でもないので保存。 あ HIw 100    <a,b,cのいずれも含まない。しかし、空白なので削除。 あ sHI 130 i j f <a,b,c,f,g,hのいずれかを含むので削除。 あ sHI 100 k a  <a,b,c,f,g,h,i,jのいずれかを含むので削除。 あ sHI 100 z ab cd  <a,b,c,f,g,h,i,j,kのいずれも含まないので保存。(ab cd はひとつのかたまり) あ sHI 100 a ab cdd  <a,b,c,f,g,h,i,j,k,z,ab,cdのいずれかを含むので削除。 い sgI 100 ga adb ced  <a,b,c,f,g,h,i,j,k,z,ab,cd,cddのいずれも含まないので保存。 で結果出力は、 あ PC 100 a b c あ HIw 100 f g h あ sHI 100 z ab cd い sgI 100 ga adb ced 以上、ややこしいのですが、もし、お時間などありましたら、ご回答いただけますと幸いです。 宜しくお願い致します。 なお、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2382509 では大変お世話になりました。 このコードを応用しようと思ったのですが、条件が複雑で、私の力では無理でした。 因みに、こういったコードを作れるコツでもあるのでしょうか? 私などは、かなり考えても思いもつきませんが・・・(涙;

質問者が選んだベストアンサー

  • ベストアンサー
  • t140
  • ベストアンサー率39% (59/150)
回答No.2

#だいたいこんな感じですかね? my(%cache, @cols); while (<DATA>){ chomp; (undef, undef, undef, @cols)= split(/\t/); @cols or next; grep($cache{$_}++, @cols) and next; print $_,"\n"; # print result } __END__ あ PC 100 a b c あ HIw 100 f g h あ HIw 100 あ sHI 130 i j f あ sHI 100 k a あ sHI 100 z ab cd あ sHI 100 a ab cdd い sgI 100 ga adb ced

ayu_mi_nic
質問者

お礼

回答いただきありがとうございます。 ばっちり動作いたしました!!

その他の回答 (1)

  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.1

ベタな処理ですが・・・^^; open(IN, "test.txt"); while(<IN>){ ($d1,$d2,$d3,@ck)=split(/\t/,$_); $f=1; foreach $d (@ck){ $d=~tr/\n//d; $f = 0 if(exists($ref{$d})); $ref{$d}++ if($d ne ""); } $result.=$_ if($f && $#ck); } close IN; open(OUT, ">test.txt"); print OUT $result; close OUT;

ayu_mi_nic
質問者

お礼

回答いただきありがとうございます。 無事動作し、とても助かりました!!

関連するQ&A