プロが教えるわが家の防犯対策術!

ファイルを行ごとに比較するシェルスクリプトをご教授ください。

例えば(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)に入れる
ことができるのかが考え付きませんでした。

よろしくお願いいたします。

A 回答 (5件)

#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
-----------------------------------------------------------------
    • good
    • 0

#です。

失礼しました。Solarisのカテゴリだったんですね。

fgrep -s -x "$data" master.txt

に訂正。
    • good
    • 0

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
    • good
    • 0

テンポラリファイルを使うとか, 予めソートしておくとか, 考えることはいろいろありそう.


その気になれば diff とかを駆使してできるのかもしれん.
    • good
    • 0

> 不一致行を(ng.txt)に入れる


最後までループして一致しなければ(ng.txt)にいれるじゃ駄目なのかな?

単純に1ファイルを引数とする子シェルを作って引数とmaster.txtを比較する。
その親シェルが(a.txt)(b.txt)(c.txt)をループで渡す。
とすれば、そんなに複雑な話じゃないと思うけど。

この回答への補足

すいません、書き間違えていました。
(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)に入ってしまうことになり手詰まりになりました・・・

補足日時:2009/05/12 21:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!