해시 목록(한 줄씩)을 다른 해시 목록과 비교하는 방법은 무엇입니까?

해시 목록(한 줄씩)을 다른 해시 목록과 비교하는 방법은 무엇입니까?

(Bash 사용) 한 해시 목록을 다른 해시 목록과 비교하려고 합니다. 각 행에 대해 중첩된 for 루프나 while 루프를 사용한 다음 if 문을 사용할 생각입니다. 첫 번째 줄을 두 번째 파일의 내용/각 줄과 비교합니다.

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

여기에 주요 비교가 누락되어 있다는 것을 알고 있습니다. 첫 번째 파일의 첫 번째 줄을 두 번째 파일의 모든 줄/해시와 비교한 다음 일치하는 항목이 발견되면 이를 새 파일에 추가하고 첫 번째 파일의 두 번째 줄로 이동합니다. 그런 다음 프로세스가 반복됩니다. 일치하는 모든 비교가 시도되고 일치하는 결과가 새 파일에 추가될 때까지.

답변1

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

hashes1그러면 및 에서 hashes2동일한 행이 모두 반환됩니다 .

다른 것을 얻으려면:

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

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

첫 번째 명령은 두 번째 파일에 없는 첫 번째 파일의 모든 해시를 표시하는 반면, 두 번째 명령은 그 반대를 수행합니다.

자세한 내용은 설명서를 참조하세요 join.


스크립트에는 세 가지 주요 문제가 있습니다.

  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. 당신도 그래야 한다변수 참조.

관련 정보