• ベストアンサー

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

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

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

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

fgrep -v -f A.txt B.txt

sou-e9
質問者

お礼

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

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答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% (4846/10257)
回答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

  • テキストファイルの一部置換したファイルをたくさん作りたい

    テキストファイル(a.txt)があるのですが このファイルの一部の文字列aaaをbbbに置換したファイル(b.txt)を作りたいです。 また文字列aaaをcccに置換したファイル(c.txt)も作りたいです。 続けてd.txtやe.txt・・・と作っていきたいですが簡単にできるフリーソフトはないでしょうか? 現状はa.txtを開いてaaaをbbbに置換して、別名で保存するのを繰り返し(10回以上)するので大変です。 このようなことが楽にできるフリーソフトがあれば教えてください。

  • テキストファイルの任意の文字以降の文字列を削除したい

    test.txt AAA+あいうえお BBB+かきくけこ CCC+さしすせそ DDD+たちつてと EEE+なにぬねの 上記(test.txt)のようなテキストファイルから、各行の+以降の文字列を削除して、 以下(result.txt)のようなテキストファイルを生成させるプログラムを作成させたいです。 result.txt AAA BBB CCC DDD EEE このようなプログラムを作るにはどのようにすればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 置換コマンド

    freeBSD5.3を使用している初心者です。 あるディレクトリ以下の全ファイルに対し、一度に内容の文字を置換したいのですがうまくいきません。 例えば /hoge/aaa.txt /hoge/bbb.txt /hoge/ccc.txt と、/hoge以下に3ファイルがあり、このファイルにAAAという文字列があるなら、AAAをBBBにしたいと思っています。 sed s/AAA/BBB/g /hoge/* とすると、置換後の中身が表示はされますが、それに置きかわったファイルは/hoge/以下に保存されていません。(もとのAAAのまま) できたら、/hoge 以下の置換されたファイルを/hoge2以下に同じ名前で保存させたいと思っています。 どなたか是非アドバイスお願いいたします。

  • Windowsでファイル内文字列置換batについて

    初めて利用します。無作法あればご指摘ください。 現在IT会社で働き始めています。 会社の教本のようなもので学習を進めているのですが、どうしてもわからないので 教えて頂きたく書き込みます。 このまま社内で徹夜かも知れません。 Windows Server 2008 R2(インストール直後で特別にtool、ユーティリティは入れていないものとする)のbat処理を 考えています。 テキストファイルtest.txtの内容が aaa △△△bbb ccc であるとき、このtest.txtを入力ファイルとして、 出力結果kekka.txtの内容が aaa bbb ccc になるようにbatファイルを作成しなさい。 (test.txtのbbbの前にある△は半角スペースの意味) スペースを別の文字列(この場合は、消去?)にする置換方法がわかりません。 http://web.plus-idea.net/2013/08/windows-bat-replace/ や http://vaindespair.blogspot.jp/2012/03/blog-post_14.html を参考にしてみたのですが、自分にスキルがまったく無いため、さっぱりです。 どなたか、お力をお借りできないでしょうか? よろしくお願いします。

  • バッチファイルで「,]区切りの文字を抜き出したい

    現在、バッチを作成しているのですが、txtファイルからの文字の抜き出しがうまくいきません。 findstr /b "aaa" C:\tmp\test.txt 上記で行毎では抜き出せるのですが、それから[ , ]区切り毎の抜き出し方がわかりません。 [test.txt] aaa,bbb,ccc,ddd eee,ffffff,ggggg,hhhh   ・   ・   ・ 下記のようにそれぞれ変数に代入したいと考えております。 aaaで実行する場合。 hoge1=aaa hoge2=bbb hoge3=ccc hoge4=ddd eeeで実行する場合。 hoge1=eee hoge2=fffff hoge3=ggggg hoge4=hhhh 変数への代入はfor文を使用しようと考えております。 追記いたしますと、各hoge~は先頭の[hoge1]を除き、行毎に文字数が異なり、行数は100行を超えますので、なんとかバッチの方で割り当てたいと考えております。 お知恵をよろしくお願いいたします。

  • 検索した文字列がある行を検索するには

    OPEN "A.txt" QWER gohjoij OPEN "B.txt" OPEN "QWERT" Write A.txt jortyu end と書かれたテキストファイル(ファイル名を"ABC.txt"とする。)があるとします。これを 1.OPEN "*.*"(*=ワイルドカード)という文字列の*.*のみに絞る 2."1."の内" "の中に、"."が無い文字列は無視する うえでリッチテキストボックス1に出力するようにします。リッチテキストボックス1には A.txt B.txt と出力されました。これをさらに[A.txt B.txt]がある行全体を、 1.別のリッチテキストボックス(リッチテキストボックス2)に出力する やり方がわかりません。この例だと、リッチテキストボックス2には OPEN "A.txt" OPEN "B.txt" Write A.txt jortyu と出力したいです。今のスキルだと到底作れそうに無いので、どなたか教えてください。

  • SED等で文字列を抽出したい

    MacOS X 10.6のターミナルを使って文字列を加工して抽出する方法の質問です。 次のような複数行からなるテキスト(ファイル名を 1.txt とします)があります。 <a href="./hoge/82111.310.12345000.htm" target="_blank"> <a href="./hoge/42403.310.33345025.htm" target="_blank"> <a href="./hoge/22154.310.50873323.htm" target="_blank"> ... このテキスト(1.txt)から、sed(?もっと適切なものがあれば別のものでも)コマンド を用いて 82111.12345000.htm 82401.33345025.htm 82111.50873323.htm ... といった具合に、 hoge/ のあとから始まり htmで終わる文字列から .310を取り除いた文字列を抜き出して ファイル一覧のテキスト(2.txt) に書き出す方法を教えてください。 なお、1.txtの行数は不定で変動し、その行数に応じて2.txtも行数が増えていきます。 また htmのファイル名のところは 5桁のランダムな数字.310.8桁のランダムな数字.htm という規則になっています。(.310 と.htm の部分は固定です) よろしくお願いします。

  • 文字列を指定して,別のファイルでその文字列が存在する行を出力する

    いつもお世話になっております. 環境はWindows XP Pro でActiveperlを用いてプログラムをしております. この度,皆様にご意見をうかがいたいのは,「文字列を指定して,別のファイルでその文字列が存在する行を出力する」という内容です. まず,以下のテキストファイルがあります. data.txt ---------------------- A BA C DA E FA G sansyo.txt ----------------------------- B D F ------------------------------- 処理として,data.txtでsansyo.txtの行が "含まれる"行数を出力する ------------------------------- output.txt ------------------------------- 2 4 6 ここで自分なりにプログラムを組んでみました. ----------------------------------- open(FILE, "sansyo.txt"); open(FILE2,"data.txt"); @file = <FILE>; close(FILE); @file2 = <FILE2>; close(FILE2); foreach $line (@file) { foreach $line2 (@file2) { if ($line =~ $line2){ $hit = $.; } open(NEWFILE, " >> output.txt") or die "$!"; print NEWFILE $hit; close(NEWFILE); } } #ここまで ------------------------------------- ですが,永久ループに入ってしまったようにファイルはできるのですが, 出力されてきません. 間違っている点をご指摘ください.

    • ベストアンサー
    • Perl
  • バッチファイルで「,]区切りの文字を抜き出したい

    現在、バッチを作成しているのですが、txtファイルからの文字の抜き出しがうまくいきません。 findstr /b "aaa" C:\tmp\test.txt 上記で行毎では抜き出せるのですが、それから[ , ]区切り毎の抜き出し方がわかりません。 [test.txt] aaa,bbb,ccc,ddd eee,ffffff,ggggg,hhhh 下記のようにそれぞれ変数に代入したいと考えております。 aaaで実行する場合。 hoge1=aaa hoge2=bbb hoge3=ccc hoge4=ddd eeeで実行する場合。 hoge1=eee hoge2=fffff hoge3=ggggg hoge4=hhhh 変数への代入はfor文を使用しようと考えております。 お知恵をよろしくお願いいたします。

  • cshの文字列置換

    ヤマトです。 cshでファイル文字列を置換したいのですが、分かりません。 環境はRed Had Linux7.2です。 hoge1.txt の中の 'HIDUKE' という文字列を今日の日付に置換し、 hoge2.txt に出力するようなシェルを作りましたが、正常に動作しません。 ====hoge1.txt(置換前)==== 今日はHIDUKEです。 ====hoge1.txt(置換前)==== 今日は030814です。 ====SAMPLE.sh(一部抜粋)==== set TODAY = `date +"%y%m%d"` sed 's/HIDUKE/$TODAY/g' < hoge1.txt > hoge2.txt 以上のようなシェルを作りました。 結果として、hoge2.txtには出力されるのですが、 「今日は$TODAYです」 となってしまいます。 変数の値を置換するにはどのようにしたら良いのでしょうか? 教えて頂けると有り難く思います。宜しくお願いします。