• ベストアンサー

2つのファイルを用いた文字列置換(削除)の方法

こんにちは。 テキストファイルA.txtに、検索したい文字列を1行ずつ入れておき、別のテキストファイルB.txtのうち、A.txtにある文字が含まれている行を削除するという作業をしたいです。 例えば A.txt AAA BBB B.txt hoge hogeAAAhoge hogeBhoge hogeBBBhoge の場合、 hoge hogeBhoge を出力させたいです。 このような処理ができる方法はないでしょうか?(コマンドやプログラム等)

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

fgrep -v -f A.txt B.txt

sou-e9
質問者

お礼

回答ありがとうございます。 fgrepでやったらできました。 しかし、下の方のお礼でも書いたように、パターンと重複している行も出力されてしまいます。 たぶんパターンの中に正規表現と同じ意味となる【+】が入っていることが原因かなと思うのですが、正規表現ではなく、ただの記号として【+】を表すようにすることは可能でしょうか? もし何かわかることがあれば教えて頂きたいです。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

>具体例としては色々あるのですが、「たった+タッタ+70+jd籐+トー+2」という文字列です。 全然具体例じゃ無いのですが。 A.txtにこういう文字列を入れて、B.txtにこういう文字列を入れて、fgrep -v -f A.txt B.txt すると、こういう文字列が予想外に表示される。 と書いてくれないと、例になってません。 >・A.txt、B.txtの文字コードはシフトJISです。 cygwinは使ってないのでわかりませんが、シフトJIS対応していないと文字によっては駄目かも。 両方のファイルをUTF-8にして試してみてください。

sou-e9
質問者

お礼

回答ありがとうございます。 >cygwinは使ってないのでわかりませんが、シフトJIS対応していないと文字によっては駄目かも。 >両方のファイルをUTF-8にして試してみてください。 両方のファイルの文字コードをEUCにしたら、無事重複しない行のみが検出できました。 また、前回の回答で具体例の書き方が不十分であったこと、大変申し訳ありませんでした。 本来ならば各テキストファイルの内容を書くべきでしたが、テキストファイルの内容が2万5千行近くあったので書くのを省略させていただき、出力結果で重複してしまっているもののうち1つだけを書かせていただきました。 何度も回答いただき、大変助かりました。 本当にありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

No2です。 fgrep は正規表現を扱えない(すべてそのままの文字として単純検索)なので、特殊文字の影響はありません。 >パターンと重複している行も出力されてしまいます 考えにくいです。何らかの勘違いだと思います。 具体的にどういう文字列ですか?現象の見られる具体例を書いてください。

sou-e9
質問者

お礼

回答ありがとうございます。 お返事が遅くなってしまい申し訳ありません。 再度、fgrep -v -f A.txt B.txt の出力結果を見てみたのですが、やはり重複する行も出力されてしまっています。 具体例としては色々あるのですが、「たった+タッタ+70+jd籐+トー+2」という文字列です。 パターン(A.txt)もB.txtも、上の例のように文字列・記号・数字で構成されているものがほとんどです。 また、あまり関係ないかもしれませんが、 ・fgrepの出力を「> output.txt」のようにファイルで出力しています。 ・PCはwindows7(64bit)、fgrepのコマンドはcygwinで行っています。 ・A.txt、B.txtの文字コードはシフトJISです。 何かわかりましたら、また教えて頂きたいです。 よろしくお願いいたします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

grep

参考URL:
http://uw714doc.sco.com/en/man/html.1/grep.1.html
sou-e9
質問者

お礼

回答ありがとうございます。 grep -v -f A.txt B.txtでやると、 【 [ または [^ が不一致です】というエラーが出てしまい困っていたのですが、fgrepでやってみたらできました。 ただ、重複しない行を出力したはずなのに、なぜか結果として出力された文字列をB.txt内で検索すると見つかります・・・。 パターンの中に数字や記号(+、/、<など)が入っているのですがそれが原因でしょうか? もし何かわかりましたらまた教えて頂けると助かります。

関連するQ&A