2つのファイルの値を比較したいのですが、場所や順序に基づいていません。

2つのファイルの値を比較したいのですが、場所や順序に基づいていません。

次の内容を含む2つのファイルがあるとします。

$ cat File1.txt
Apple
orange
watermelon
avocado
lime
$ cat File2.txt
orange
Apple
lime 
watermelon
avocado

どちらも同じ値を持つため、デフォルトでは違いはありません。私はdiff次のコマンドを使用しています:

diff File1.txt File2.txt

無効な値によってファイルが異なることを示します。私の場合、違いは表示されません。これを達成する他の方法はありますか?どんな提案でも歓迎します。

答え1

ソートされたファイルを比較します。

Bash(またはkshまたはzsh)では、次を使用します。プロセスの交換:

diff <(sort File1.txt) <(sort File2.txt)

簡単に言うと:

sort File1.txt >File1.txt.sorted
sort File1.txt >File2.txt.sorted
diff File1.txt.sorted File2.txt.sorted

ソートされたファイル間の違いをすばやく確認するには、comm役に立ちます。あるファイルの行を直接表示しますが、別のファイルの行は表示しません。

comm -12  <(sort File1.txt) <(sort File2.txt) >common-lines.txt
comm -23  <(sort File1.txt) <(sort File2.txt) >only-in-file-1.txt
comm -13  <(sort File1.txt) <(sort File2.txt) >only-in-file-2.txt

同じファイルで1行が繰り返される場合、上記のコマンドは両方のファイルの繰り返し数が同じであると主張します。治療したい場合

foo
bar
foo

同じ

bar
foo

次に、並べ替え時に重複したアイテムを削除します。sort -u代わりに使用してくださいsort

あるファイルの出力を保存しsort、後で別のファイルを使用できるようにするときにそれらを使用する場合は、両方のファイルを同じロケールでソートする必要があります。これを行うには、おそらくバイト順に並べ替える必要があります。

LC_ALL=C sort File1.txt >File1.txt.sorted

答え2

まず、ファイルをソートします(bash)。

diff <(sort file1) <(sort file2)

答え3

awkを使用すると、次のコマンドを使用して各テキスト入力行のハッシュインデックスを作成できます。

awk 'The magic' Q=A fileA Q=B fileB Q=C fileC ...

各入力ラインの「魔法」は次のとおりです。

{ X[$0] = X[$0] Q; }

END条件に達すると、Xのインデックスを繰り返します。各ファイルに一度だけ表示される行は次のとおりです。

X["Apple"] = "ABC";

fileA で 1 回発生し、fileC で 3 回発生する行は「ACCC」と表示されます。必要に応じて、ファイルの数に関係なく、すべての異常を報告できます。 (私は、ライブデータベースとOracleデータベースを持つプライマリサーバーとスタンバイサーバーで実行されている安全性が重要なシステムを14方向に比較する必要がありました。)

各ラベルに行番号NRを含め、興味深いパターンを作成すると、ラベルを次のように作成できます。

X["Walrus"] = "A347B38C90"

各ファイルのどの行に一致するテキストがあるかを報告します。

関連情報