- ベストアンサー
perlかベクターなどのフリーウェアでこれはできますか?
1.txt abc def ghi jkl mno pqr stu 2.txt mno abc 123 900 456 def stu qqq プログラム 1.txtと2.txtを比べて、1.txtに無い文字を3.txtへ書き出す。 3.txt 123 456 900 qqq Excelなら分割して何度かソートとIFを使えば解決できなくも無いのですが、今回は、行数が100万行を超えているため現実問題として無理です。 そこで、perlで行いたいのですがどのようにすればできますか? 良い方法が思いつきません。。。 どなたか、教えていただけないでしょうか? もしくは、これを解決するためのフリーウェアなどあればとても、助かります。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#!/usr/bin/perl use strict; use warnings; ### ファイル my $file1 = '1.txt'; my $file2 = '2.txt'; my $file3 = '3.txt'; ### 検索用ハッシュ my %list; ### 1.txtの内容を取り込む open IN1, '<', $file1 or die "cannot read $file1 : $!"; while(<IN1>){ s/\r?\n//; $list{$_} = 1; } close IN1; ### 重複内容を書き出し open IN2, '<', $file2 or die "cannot read $file2 : $!"; open OUT, '>', $file3 or die "cannot write $file3 : $!"; while(<IN2>){ s/\r?\n//; unless($list{$_}){ print OUT $_, "\n"; } } close OUT; close IN2;
その他の回答 (3)
- SE-1
- ベストアンサー率57% (26/45)
# いろんなやり方があるでしょう。そしてこれ↓はベストではないでしょう・・・ #でも、わかりやすいやり方かな、と思って一応回答します。 use strict; open (IN2, "< 2.txt"); my @in2=<IN2>; # @in2 に 2.txt の各行が要素として入ります。 close IN2; open (IN1, "< 1.txt"); undef $/; my $in1=<IN1>; # $in1 に 1.txt の内容が全部入ります。 close IN1; open (OUT, "> 3.txt"); foreach (@in2){ s/\n//; # 1.txt の最後の stu にマッチしなかったので入れました。 next if $in1 =~ /$_/s; print OUT "$_\n"; } close OUT;
お礼
回答いただきありがとうございます。 ものすごく助かりました!!感謝です!!
perl では出来ます。 全然問題なく。
お礼
回答いただきありがとうございました。
- yoneda_16
- ベストアンサー率47% (166/350)
Windowsだと面倒ですね。UNIXとかMacだったらこういうのすぐなんですけど。 とりあえず、CygwinかSFUをインストールしましょう。 http://pcweb.mycom.co.jp/special/2002/cygwin/ http://www.microsoft.com/japan/windows/sfu/ あとはコマンドラインでこんな感じ。 sort 1.txt > 1.tmp sort 2.txt > 2.tmp diff 1.tmp 2.tmp |grep ">" |sed -e 's/> //' sortコマンドで順番をそろえて。diffで差分を取って。grepで1にしかないものを集めて。sedで行頭の"> "を取る。perlで書くほうが面倒かも。
お礼
回答いただきありがとうございます。 使ったことが無いものなので、詳しく、調べてみたいと思います。 ありがとうございます。
お礼
回答いただきありがとうございます。 ものすごく助かりました!!感謝です!!