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

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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q復元ポイントの作成とイメージファイル等のバックアップとの違いについて

今晩は、宜しくお願いします。

復元ポイントの作成とイメージファイル等のバックアップとの違いについて教えて下さい。

Windowsで復元ポイントからシステムを復元させる方法があり、
また、イメージファイル等にバックアップをとり、復元させる方法もありますが
この両者はどのように違うのでしょうか。

復元ポイントの作成とは、その時点のシステムの設定等だけを保存しているという
ことでしょうか。

また、イメージファイル等のバックアップを作成するということは
システム設定と作成したファイル等もイメージファイルとして一括してバックアップ
されるのでしょうか。

イメージファイルの復元時に、作成したファイル等もイメージファイルから
復元されるのなら、同じ名前のファイルがあった場合には、
イメージファイル作成時の古い情報のファイルになってしまうのでしょうか。

以上、宜しくお願いします。

Aベストアンサー

【システムの復元】
Windowsが使用するシステムファイルのバックアップと復元。
ユーザーファイルには影響しない。
HDDの中に作成されるので、Windowsが起動しない環境では使用出来ない。

【システム修復ディスクの作成】
Windowsの起動時にF8を押下して起動するセーフモードから「コンピューターの修復」「システム回復オプション」を、外部記憶装置(CD、USBメモリなど)から起動出来るようにする。
Windows自体が起動しなくなった場合に、外部記憶装置から「システム回復オプション」が起動出来るようになる。修復されるのは、選択した項目により異なる。
WindowsREを利用。
https://msdn.microsoft.com/ja-jp/library/hh825173.aspx

【バックアップと復元】
システムのバックアップを作成し、ハードディスクなどが壊れた場合に備えパソコン内部のデータを全てバックアップ・復元出来る。
Windowsのインストールディスクや、システム修復ディスクから復元が可能。
システムもユーザーデータもバックアップを取った時点の状態に戻る。

【システムの復元】
Windowsが使用するシステムファイルのバックアップと復元。
ユーザーファイルには影響しない。
HDDの中に作成されるので、Windowsが起動しない環境では使用出来ない。

【システム修復ディスクの作成】
Windowsの起動時にF8を押下して起動するセーフモードから「コンピューターの修復」「システム回復オプション」を、外部記憶装置(CD、USBメモリなど)から起動出来るようにする。
Windows自体が起動しなくなった場合に、外部記憶装置から「システム回復オプション」が起動出来るようになる。...続きを読む

Q*.txtファイルの最終行だけ参照して、バッチファイルを作りたい

*.txtファイルのなかに"test"という文字をfindstrコマンド又はfindコマンドで探して、出力したいのですが、全ての行を参照して出力するのではなくて、最終行だけを参照して出力するといったバッチファイルを作成したいのですが、どうやればいいのでしょうか?

どうぞよろしくお願いいたします。

Aベストアンサー

tail コマンドを探してきて入れる(インストール)

for %%f in (*.txt) do find "test" %%f | tail -1

Q救出ファイル復元 2の機能について

「救出ファイル復元 2」で画像ファイルJPEGの他にRAWファイル、拡張子(CR2)を復元出来るでしょうか。

キャノンの一眼デジカメを使っているのですが、他の復元ソフトでは、復元出来ませんでした。

Aベストアンサー

Vectorあたりで『ディスク・ファイル復旧』の項目で探せばみつかりそうですが。
要は,"復元ソフトで復元できるファイルがソフトに登録されている拡張子だけしかできない"ことですので,拡張子を選択できる復元ソフトを捜せばいいと思われます。

参考URL:http://www.vector.co.jp/vpack/filearea/win/util/disk/care/

Qgrepで'-x'がある行をgomi.txtから探すために

grep -x gomi.txt

を実行したのですが-xがオプションとみなされうまくいきません
どうしたらいいでしょうか?

Aベストアンサー

$ grep -e -x gomi.txt

Q削除した画像ファイルの取り出しまたは復元方法

ごみ箱に入れてから削除したファイルの復元方法を教えてください。

以前にも同様の質問をしたのですが、その際に教えていただいた方法で確かにいくつかのファイルは復元することができました。

しかし、一番復元したい画像ファイル(jpeg形式)が復元できません、同時期に同じく削除したファイルは無事に取り出せたのですが肝心のファイルは取り出せません。指定するファイル名、フォルダ名などの間違いはないのですが何が原因で復元できないのか理解できません。

良きアドバイスをいただければ助かります。
宜しくお願いいたします。

Aベストアンサー

こういったファイル復元ソフトを利用してファイルを復活させます。

●FileRecovery(フリーウェア)

消去・欠損したファイルを復元するソフト。
http://www.pcinspector.de/download.htm

●復元(フリーウェア)
http://www.vector.co.jp/soft/win95/util/se192983.html

■FINALDATA(ファイナルデータ)フォトリカバリー3.0(有料)
http://www.finaldata.ne.jp/f_8_3.html

当然ながら復元できる確立は有料ソフトのほうが高いです。

これらを使っても復元できない場合はファイルが上書きされて完全に消えている可能性が高いです。

QUNIX Cシェルで実数の比較

UNIX Cシェルで実数の比較がしたいのですが、
うまくいきません
以下のような結果になります。
うまく判定するにはどうすればよいのでしょう

#!/bin/csh -f
set CONSIZE=-0.01
echo "CONSIZE = $CONSIZE"
@ CONSIZE = $CONSIZE
if( $CONSIZE < 0.0 )then
echo " 0以下;;; $CONSIZE"
exit
endif

実行
CONSIZE = -0.01
@: 数値形式が正しくありません。

Aベストアンサー

整数しか扱えない為、そのままでは比較することができないようです。

bc を利用してみてはいかがでしょうか?

#!/bin/csh -f
set CONSIZE=-0.01
echo "CONSIZE = $CONSIZE"
set x = `echo "scale=3;if( $CONSIZE < 0 ) 1" | bc`

if( $x == 1 )then
echo " 0以下;;; $CONSIZE"
exit
endif

Q「ウイルス感染ファイル」削除後のシステム復元でどうなる?

ウイルスバスターで幾つかのウイルス感染ファイル発見し全て削除しましたが、感染したファイルはシステムファイルでしたので少し心配でしたが削除しました。
そこで教えて頂きたいのですが、感染した日付以前でシステムの復元をする事によって削除されたシステムファイルは復元できるのでしょうか?一度削除されたシステムファイルはシステムの復元をしても二度と復元しないのでしょうか?

Aベストアンサー

以下WindowsXPという前提で・・・

>システムファイルでしたので少し心配でしたが削除しました。
通常、このままではシステムエラーが発生します。
しかし、Windowsには自動復旧機能があり、削除されたファイルをハードディスク上にあるCabファイルから呼び出して復旧させるようになっています。
従って、殆どの場合、削除されたシステムファイルを手動でインストールする必要はありません。

☆SFCの実行
もしシステムエラーが出る場合SFC(System File Checker)の実行をお勧めします。

1.CDドライブにOSのインストールディスクを入れておく。
2.「スタート」「コマンドプロンプト」または「ファイル名を指定して実行」で
「sfc /scannow」と入力して「OK」

「Windows XP professional のディスクを入れてください」という表示が出ることがありますがHome Editionであれば「無視」を選んでスキップしてください

>感染した日付以前でシステムの復元をする事によって削除されたシステムファイルは復元できるのでしょうか?
出来ないことはないでしょうが、あまりお勧めできません。
現在の状態が正常でない。
過去の状態の方が快適に操作できる。
という場合、それがいいかもしれません。
しかし、Windowsの設定というのは非常に広範囲にわたっており、現在と過去を比較して、どちらが適正かを判断するのは容易ではありません。
また、過去の復元ポイントの中には不正な設定が含まれている場合があり、間違って、そのポイントを選択することもあります。
ウィルス対策ソフトのサイトでは一旦復元設定を無効にして、過去の復元ポイントを全て消去することを推奨しています。

>一度削除されたシステムファイルはシステムの復元をしても二度と復元しないのでしょうか?
間違った操作をすると汚染されたファイルが復元されてしまいます。
一旦復元設定を無効にして、過去の復元ポイントを全て消去することで汚染されたファイルは二度と復元しません。

以下WindowsXPという前提で・・・

>システムファイルでしたので少し心配でしたが削除しました。
通常、このままではシステムエラーが発生します。
しかし、Windowsには自動復旧機能があり、削除されたファイルをハードディスク上にあるCabファイルから呼び出して復旧させるようになっています。
従って、殆どの場合、削除されたシステムファイルを手動でインストールする必要はありません。

☆SFCの実行
もしシステムエラーが出る場合SFC(System File Checker)の実行をお勧めします。

1.CDドライ...続きを読む

Q複数のファイルをdiffで比較するために以下のシェルを作成しましたが

複数のファイルをdiffで比較するために以下のシェルを作成しましたが
diff: 「ファイル名」の後のオペランドがありません
とエラーが表示されてしまいます。
htmlディレクトリとhtml_bkディレクトリ内にある
ファイルを比較する処理になります。

========================================
find ./html -name *.html -type f |
while read f
do

echo $f | sed 's/html/html_bk/g' $temp
diff $f $temp >> diff.txt

done
======================================
$tempの中身はhtml_bkと変更されていました。

原因が分かる方がいましたら教えてください。

Aベストアンサー

> htmlディレクトリとhtml_bkディレクトリ内にある
> ファイルを比較する処理になります

diff -r html html_bk
で一発なんですけど....


このシェルスクリプトを完成させるなら

# -nameで*を使いたいときは""で括る
find ./html -name "*.html" -type f |
while read f
do
# 実行結果を変数に取り込むならバッククオートを使う
# 先頭が必ず ./html/ になるから、htmlを置き換えればいいのだけど、
# より正確にするなら、こんな感じ
temp=`echo $f | sed 's|^\./html/|./html_bk/|'`

# ファイル名の空白が含まれることも考慮して、""で括る
diff "$f" "$temp" >> diff.txt
done

Q復元ソフトのふと感じた疑問 -ファイル名を削除したい-

先日、復元ソフトを使用していたときに感じたことなのですが
(使用ソフトは「復元」です。)
ファイルを復元する際の手順で削除したファイルが検索できますよね。
このファイル検索の時に、HITしないようにファイル名を完全に削除したい場合はどのようにすればいいのでしょうか??

例えば、「●●との秘密旅行001.jpg」のファイルを削除したとします。
その後、復元ソフトで検索をかけるとファイルを復元しなくてもファイル名を見ただけで怪しいファイルとわかってしまいますよね。
復元ソフトの検索で、表示されなくする方法か、別名に変える方法があるのなら教えてください。

Aベストアンサー

95159さんが求めていらっしゃるのは以下の方法ではないでしょうか。

フリーの復元ソフトに「DataRecovery」というものがあります。このフリーソフトには「削除したファイル」の名前を時間をかけず簡単に消去できる機能が付いています。

『DataRecovery』
http://www.vector.co.jp/soft/win95/util/se382922.html

■使い方
起動させる→該当ドライブをクリック→[スキャン]ボタンをクリック→削除したファイルの表示完了→「目的のファイルが見つかりましたか?」と出てきたら[キャンセル]をクリック→名前を消去したいファイルをクリックするか、名前を消去したい複数ファイルを左クリックしながら選択する→[消去]ボタンをクリック→[OK]をクリック

これで、名前を消せます。しかしながら完璧ではなくて、一部消せないこともあります。
(「DataRecovery」を再起動してもう一度ドライブをスキャンすると消せなかったファイルが表示されます)

参考URL:http://www.vector.co.jp/soft/win95/util/se382922.html

95159さんが求めていらっしゃるのは以下の方法ではないでしょうか。

フリーの復元ソフトに「DataRecovery」というものがあります。このフリーソフトには「削除したファイル」の名前を時間をかけず簡単に消去できる機能が付いています。

『DataRecovery』
http://www.vector.co.jp/soft/win95/util/se382922.html

■使い方
起動させる→該当ドライブをクリック→[スキャン]ボタンをクリック→削除したファイルの表示完了→「目的のファイルが見つかりましたか?」と出てきたら[キャンセル]をクリック→名...続きを読む

QBシェルとCシェル

Solarisサーバの運用において、シェルでスクリプトを作成する場合、BシェルとCシェルでは、どちらが多く用いられているでしょうか?

Aベストアンサー

ちょっと補足。
BshかCshかという選択ならBshですが、他の方が言っておられるようにbashなどで書いても構いません。

・一般ユーザが利用するsetuidしていないスクリプト
 shでもbashでもzshでもなんでもよい。
 csh系(tcshも)だけはやめた方が無難。
・setuidしていいるスクリプト
 シェルスクリプトはsetuidしないのが安全。
 csh系(tcshも)だけはやめときましょう。

・Solaris以外のOSに移植するかも知れないスクリプト
 shかbashで書く。
 OSにデフォルトで存在するシェルで書いておいた方が無難。
 shはどのOSにもあるが、微妙なところで仕様が違うので要注意。
 ただ、Solarisの/bin/shは一番古くて仕様がしょぼいので、
 Solarisで動けばよそに持っていっても動くと期待できる。

・システムのブート段階などで動くスクリプト
 基本は/sbin/sh。シェルがスタティックリンクされている必要がある。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報