質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.37%

  • Linux

    2691questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

2つのファイルを比較するシェルが作れない

受付中

回答 1

投稿 2017/11/27 19:27 ・編集 2017/11/27 19:34

  • 評価
  • クリップ 0
  • VIEW 97

chappy73

score 0

現場で、ある定義ファイルを変更する作業を自動化するという試みをしており、その中で変更前と変更後の差分取得のシェル作成に手間取っています。具体的には
①bef.txtファイルとaft.txtファイルをif文で1行ずつ比較する。
②差分があった場合、aft.txtの該当行と、事前に用意した変更部分のみ記載したaft2.txtを1行ずつ比較する。
③差分が無ければ途中となっている①の処理に戻る。

これにより変更されるべき部分が正しく変更されたこと、変更されてはいけない部分が変更されていないことの2点が証明できることが目的です。

発生している問題・エラーメッセージ

・1行ずつ処理する場合、行番号を変数に入れて1ずつ増加していく方法を
取ると思うが、「1行目から最終行まで」と指定する方法がわからない。
・上記②の部分の処理方法がわからない。

該当のソースコード

for Num in seq 100
do
bef1=sed -n "$Num"P "/work/bef1.txt"
aft1=sed -n "$Num"P "/work/aft1.txt"
if [ $bef1 = $aft1 ];then
echo "OK"
else
echo"NG"
fi
done

試したこと

半日ネットで調べたのですが、for文にてループ、if文にて比較というところまでしかわかりませんでした。初心者のため、1行ずつ行番号を変数に格納し引数に指定する。if文で比較する。と分けてもここまでしか考えられませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

Linuxのシェルスクリプト

【追記】
diffコマンドだと、ある特定条件下で正常に作動しないことが過去にあったようです。何故正常に作動しなかったかは不明で、調べても何もヒットしなかったのですが、過去にその事例があったため今回はif文での比較をしたいと考えています。
どうぞよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+3

自作する必要はないと思います。diffコマンドを使ってください。

投稿 2017/11/27 19:30

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/27 19:39

    KojiDoiさん
    早速の回答ありがとうございます。
    diffコマンドだと、ある特定条件下で正常に作動しないことが過去にあったようです。何故正常に作動しなかったかは不明で、調べても何もヒットしなかったのですが、過去にその事例があったため今回はif文での比較をしたいと考えています。

    キャンセル

  • 2017/11/27 20:58

    正常に作動しなかった理由が不明確であり、根拠が無いためKojiDoiさんの提示されたdiffを使われるのが良いと思います。OSの標準コマンドですので、それを超えるような品質のプログラムを作る方が大変かと。

    diffが正常でないということであれば、世の中の企業の大多数が大変なことになります。

    キャンセル

  • 2017/11/27 21:27

    KojiDoiさんやgitya107さんに同意ですが、理由をより明確に述べようとするなら・・・
    「diffが正常に動作しなかった原因が不明のまま別の方法を使う場合、何をもってdiffの不具合を回避できたか根拠がない」
    と言えそうです。原因が曖昧なら何を使っても(sedを使おうがawkを使おうがbashを使おうが)何も変わらない気がします。

    キャンセル

  • 2017/11/28 13:56

    どちらかというと"diffコマンドが、ある特定条件下で正常に作動しない"といった内容でスレッドを挙げた方がまだ建設的かと思います。
    "-i" や "-b"オプションのような特定の差分を無視するオプションを
    理解しないまま利用して「差分が確認できない!」と仰られている可能性が高いと予想しています。
    絶対に無いとまでは言い切れませんが、diffのように使い込まれたコマンドにおいて
    そのコマンドが利用できないようなバグが存在するならば「調べても情報が出てこない」ようなことは今日日発生しないと考えられます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.37%

関連した質問

同じタグがついた質問を見る

  • Linux

    2691questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。