2つのファイルをシェルスクリプトで比較するにはどうすればよいですか?


10

2つのファイルがあるとすると、file1から各行を読み取り、それがfile2にあるかどうかを確認するシェルスクリプトを作成します。行が見つからない場合は、異なる2つのファイルを出力して終了する必要があります。ファイルには、単語番号などを含めることができます。例えば ​​:

file1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hello

この場合、2つのファイルは等しいはずです。file2に「hello !!!」がある場合 「こんにちは」の代わりに、ファイルは異なります。私はbashスクリプトを使用しています。これどうやってするの。ネストされたループでそれを行う必要があることは重要ではありませんが、それが唯一の方法だと思ったのはそれです。ご協力いただきありがとうございます。

回答:


9

bashでは:

diff --brief <(sort file1) <(sort file2)

ファイルがcsvファイルの場合はどうなりますか?並べ替えはまだ機能しますか?
0x0

sort指示がない限り、正確な内容を気にする必要はありません。
Ignacio Vazquez-Abrams

どの行が異なるかを見つけることは可能ですか?
0x0

--briefフォーマットオプションを削除して追加します-u
Ignacio Vazquez-Abrams

10

diff終了ステータスを設定して、ファイルが同じかどうかを示します。終了ステータスは、特殊変数でアクセスできます$?。このようにして、イグナシオの答えを拡張できます。

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi

3
if diff ... >/dev/null括弧と変数なしで実行できます。
追って通知があるまで一時停止。

1

[[]] && ||と思うので、これを追加します 構成はかなりきれいです:

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")

1

うまくいくはずです:

comm -3 file1 file2

答えにはこれで十分だと思います...


1

一方でdiff完全に罰金答えは、私はおそらく使用したいcmp二つのファイルのバイト比較でバイトをしているため、具体的である代わりに。

https://linux.die.net/man/1/cmp

このため、バイナリファイルを比較できるという追加のボーナスがあります。

if cmp -s "file1" "file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

diff個人的にはテストしていませんが、使用するよりも高速だと思いました。


「ファイルが異なります」のケースが最初になりますか?ifテストは、何かが真かどうか、つまりゼロ以外の戻りコードかどうかを尋ねます。ファイルが一致すると、cmpは(マンページごとに)0を返すため、2番目のケースになるはずです。
user8162 '10 / 03/19

@ user8162あなたが言うことは理にかなっていますが、私はそれをテストしたばかりであり、それは正しい方法です。正直なところ、なぜそうなるのかよくわかりません。
Richard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.