• ベストアンサー

ファイルを行ごとに比較するシェルスクリプトについて

ファイルを行ごとに比較するシェルスクリプトをご教授ください。 例えば(master.txt)(a.txt)(b.txt)(c.txt)(ok.txt)(ng.txt)と4つのファイルがあり、 (master.txt)と(a.txt)の行を比較し(a.txt)の中のある行が(master.txt)の行と一致した場合(ok.txt)に (master.txt)の行と一致しなかった場合(ng.txt)に入れる。 その後(master.txt)と(b.txt)の比較し(a.txt)が使用したものと同じ(ok.txt)or(ng.txt)に入れる・・・ といったように繰り返していくシェルスクリプトはどのようにして作成するのでしょうか? txtファイルの中の行はランダムに入っており、x.txtの一行一行ををmaster.txtの全行と比較する必要があります。 自分で作ってみたものは、while文を2重で使い一行ずつ取り出しcase文で行が一致した物を(ok.txt)に入れる 所までは成功しているのですが、複数回繰り返す時にどのようなロジックで不一致行を(ng.txt)に入れる ことができるのかが考え付きませんでした。 よろしくお願いいたします。

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

  • ベストアンサー
  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.3

#1です。 うーむ。やりたいことがいまひとつわからないのですが・・・。 case文で比較したいってことがネックなのかな? ※以下はアルゴリズムとして捕らえてください。 シェルの種類とかバージョンで異なると思うし、検証した訳でないので・・・。 ----------------------------------------------------------------- cat /dev/null > ok.txt cat /dev/null > ng.txt for fn in a.txt b.txt c.txt ; do while read line ; do flg=0 while read line2 ; do if [ $line = $line2 ]; then echo $line >> ok.txt flg=1 break fi done < $fn if [ $flg -eq 1 ]; then echo $line >> ng.txt fi done < master.txt cp ng.txt master.txt cat /dev/null > ng.txt done -----------------------------------------------------------------

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.5

#です。失礼しました。Solarisのカテゴリだったんですね。 fgrep -s -x "$data" master.txt に訂正。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.4

Linux等gnuのgrepだとして、 for f in a.txt b.txt c.txt do while read data do if fgrep -s -q -x "$data" master.txt then echo "$data" >> ok.txt else echo "$data" >> ng.txt fi done < $f done

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

テンポラリファイルを使うとか, 予めソートしておくとか, 考えることはいろいろありそう. その気になれば diff とかを駆使してできるのかもしれん.

すると、全ての回答が全文表示されます。
  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.1

> 不一致行を(ng.txt)に入れる 最後までループして一致しなければ(ng.txt)にいれるじゃ駄目なのかな? 単純に1ファイルを引数とする子シェルを作って引数とmaster.txtを比較する。 その親シェルが(a.txt)(b.txt)(c.txt)をループで渡す。 とすれば、そんなに複雑な話じゃないと思うけど。

goro-_-
質問者

補足

すいません、書き間違えていました。 (a.txt)を(ok.txt)や(ng.txt)に入れるのではなく、(master.txt)を(ok.txt)や(ng.txt)に入れて、 2回目より(ng.txt)を(master.txt)にリネームして回そうと考えていたのですが、 (master.txt)を(ng.txt)に入れるロジックが分からないのです。 while文を2重で使いその内側のcase文にて一致を(ok.txt)に入れそれ以外を(ng.txt)にいれると 内側が回転する毎に(master.txt)の一致しない全ての行が(ng.txt)に入ってしまうので、 全て不一致だと(master.txt)の行×(a.txt)の行分(ng.txt)に入ってしまうことになり手詰まりになりました・・・

すると、全ての回答が全文表示されます。

関連するQ&A