awk/bashのファイル比較

awk/bashのファイル比較

問題がありますが、最善の解決策を見つける方法がわかりません。次のファイルのリストがあります。

file1\0file2\0...fileX\0\0file(x+1)\0

\0各ファイル名は、各ファイルグループの追加の区切り文字で区切られています\0。すべてのグループ内のすべてのファイルには同じハッシュコードがあります(私はそれを計算するためにmd5sumを使用します)。各グループのどのファイルが同じかを見つけて印刷する必要があります。

たとえば、6つのファイルセットがあります(f1、f2、f3、f4、f5、f6と呼びます)。私はdiffを使用してf1、f2、f3が同じでf4、f5も同じであることを発見しました(しかしf1、f2、f3とは異なります)。だから、f1、f2、f3、f4、f5ファイルを印刷したいのですが、f6は印刷したくありません(f6の重複項目が見つからないためです)。

私は| while read -r -d $'\0' fileデータを読み取るために使用します。私が最良の方法を見つけるのを助けることができますか?

編集:私の質問を単純化します。 n個のフィールドを持つ配列があります。私は最も遅いアルゴリズムではなくbashで実装しやすいアルゴリズムを探しています。このアルゴリズムは、同じ値を見つけ、その値の末尾に数字を追加して後でソートするのに役立ちます。私の例を参照すると、「ソート」の後に「f1 1」、「f2 1」、「f3 1」、「f4 2」、「f5 2」、「f6 3」を印刷し、awkを使用して修正したいと思います。テーブル。

ベストアンサー1

MD5を使用する必要があり、入力ファイルにハッシュ競合があると仮定する場合(他のバイナリファイルにはMD5以上がある場合)、ハッシュ時にランダムSALT(短いランダム文字列)を使用して競合を発生させることができます。チェックサムが再び変更されます。

例えば

#!/bin/bash
SALT=$(dd if=/dev/urandom status=none bs=1c count=128)

FILES=("f1" "f2" "f3" "f4" "f5");
for file in "${FILES[@]}"
do
     echo $(echo $SALT | cat - "$file" | md5sum --binary | cut -d' ' -f1) $file
done

これにより、各ファイルのMD5ハッシュが計算されます。文書、ランダムに生成された128バイトを追加します。混合され、次の出力が生成されます。

741eefc6c14d80ee38164a0961cfd200 f1
741eefc6c14d80ee38164a0961cfd200 f2
741eefc6c14d80ee38164a0961cfd200 f3
68441eb38393a75dee94ae089d528633 f4
68441eb38393a75dee94ae089d528633 f5

このコマンドを再実行すると、別のチェックサムが得られます(例:さまざまですが、まだ重複ファイルと一致します。

bc2fdca1b765989b62e507711749c5b4 f1
bc2fdca1b765989b62e507711749c5b4 f2
bc2fdca1b765989b62e507711749c5b4 f3
a31019a6ace1f51b18920bb33d781c97 f4
a31019a6ace1f51b18920bb33d781c97 f5

これで、この「MD5SUMファイル」リストを処理して重複リストを取得できます。

また、複数の\0\0区切りグループ、\0区切りファイル名などの形式で入力データを処理するように調整する必要があります。 (宿題のすべての楽しみを取り除くことなく)。

おすすめ記事