ハッシュリスト(1行)を他のハッシュリストと比較するには?

ハッシュリスト(1行)を他のハッシュリストと比較するには?

(Bashを使用)あるハッシュリストを別のハッシュリストと比較しようとしています。各行に入れ子になったforループまたはwhileループを使用してから、ifステートメントを使用します。最初の行を2番目のファイルの内容/各行と比較します。

for a in 'cat file1.sh'   
    do
    echo $a
           for b in 'cat file2.sh'
               do
               echo $b
                   if [ "$a" == "$b" ]
                   then
                   echo $a $b
                   fi


done
done

ここで主な比較が欠けていることを知っています。最初のファイルの最初の行を2番目のファイルのすべての行/ハッシュと比較し、一致するものが見つかったら、それを新しいファイルに追加して最初のファイルの2行目に移動します。その後、処理が繰り返される。一致するすべての比較が試みられ、一致する結果が新しいファイルに追加されるまで。

答え1

$ join <( sort hashes1 ) <( sort hashes2 )

hashes1これにより、 と でhashes2同じ行がすべて返されます。

他のものを入手するには:

$ join -v 1 <( sort hashes1 ) <( sort hashes2 )

$ join -v 2 <( sort hashes1 ) <( sort hashes2 )

最初のコマンドは2番目のファイルにない最初のファイルのすべてのハッシュを表示しますが、2番目のコマンドはその逆を実行します。

詳細についてはマニュアルを参照してくださいjoin


スクリプトには3つの主な問題があります。

  1. 'cat file1.txt'ただテキスト文字列です。必要に応じてfile1.txt使用するコンテンツです$( <file1.txt )

  2. ファイルの完全なデータをインポートしてからループを使用して繰り返すのは良い考えではありませんfor。大きなファイルの場合、これはメモリの無駄です。代わりに:

    while IFS= read -r line; do
      ...
    done <file1.txt
    

    詳細については、IFS= read -r次を参照してください。「IFS=read -r line」を理解しましたか?

  3. あなたもそうしなければならない変数参照

関連情報