cmp 대신 awk를 사용하여 비교 결과를 변수에 저장하는 방법

cmp 대신 awk를 사용하여 비교 결과를 변수에 저장하는 방법

새 파일과 이전 파일을 비교하여 다운로드한 파일이 중복되는지 확인하는 checkDuplicateDownload.sh라는 파일이 있다고 가정합니다.

이것이 제가하는 것입니다.

duplicate=`cmp $prevFile newFile -b`

duplicate결과를 저장할 변수이고 cmp, prevFile는 이전 파일이고, newFile는 새 파일입니다. 파일이 동일하면 값은 0 duplicate이고 그렇지 않으면 1입니다.

위 명령 과 cmp동일한 작업을 수행하되 awk를 사용하고 비교를 duplicate변수에 저장하려면 어떻게 해야 합니까?

답변1

당신이 설명하는 것은 두 파일을 자동으로 비교하는 것 같습니다. 첫 번째 코드 조각은 종료 상태를 cmp변수 에 넣습니다 duplicate(0 = 일치, 그렇지 않으면 문제가 있습니다. man cmp종료 상태 값에 대한 자세한 내용을 참조하세요).

cmp -s prevFile newFile
duplicate=$?

하지만 다음에 하고 싶은 일은 그 가치를 테스트 $duplicate하고 이에 대한 작업을 수행하는 것일 것입니다. 이 경우 종료 cmp값 을 직접 테스트할 수도 있습니다.

if cmp -s prevFile newFile
then
    echo "Files match"
else
    echo "Files do not match (or one is missing, unreadable, etc.)"
fi

변수를 사용하려는 경우 변수를 사용할 때 큰따옴표로 묶어야 한다는 것을 잊지 마십시오.

cmp -s "$prevFile" "$newFile"

$prevFile또한 아직 존재하지 않는 것이 가능한지 고려하십시오 .

마지막으로, 어떻습니까 awk? 작업에 적합한 도구가 아니므로 여기서는 사용하지 마십시오.

답변2

이것을 사용할 수 있습니다 awk. 이렇게 하는 것은 별 의미가 없습니다. 파일 비교 를 위해 특별히 설계된 도구가 있습니다( diff등 ). 반면에 임의의 작업에 사용할 수 있는 강력한 스크립트 언어입니다. 따라서 실제로 이러한 도구의 기존 기능을 에서 다시 구현할 수 있지만 다른 도구가 더 잘 수행하는 작업을 더 느리고 덜 효율적인 방식으로 수행하는 것 외에는 어떤 이점도 얻을 수 없습니다.cmpmd5sumawkawk

예를 들어, awk프로그램은 두 파일이 동일한지 아니면 다른지 알려줍니다.

$ cat comp.awk
#!/usr/bin/awk -f

BEGIN{
  differ=0
}
NR==FNR{
  a[FNR]=$0; 
  last=FNR; 
  next
}
{ 
  if(FNR>last || "x"$0"x" != "x"a[FNR]"x" ){
    differ=1
    exit;
  }
} 
END{
  if(FNR<last){
    differ=1
  }
  print differ
}

따라서 이것을 사용하여 비교를 변수에 저장할 수 있습니다.

duplicate=$(comp.awk prevFile newFile)

변수는 0파일이 동일한지 1다른지 여부입니다. 하지만 기존 도구를 사용하면 동일한 작업을 더 빠르고 효율적이며 더 안정적으로 수행할 수 있습니다.

duplicate=$(diff -q prevFile newFile)

물론 값은 단순한 1OR 이 아니며 OR 또는 빈 문자열이 0되지만 실제 차이는 없습니다. Files prevFile and newFile differ아마도 후속 테스트 작업에서 이 변수를 사용하고 싶을 것이며 이를 완벽하게 수행할 수 있습니다.

$ [[ -z $duplicate ]] && echo differ || echo same
differ

따라서 이미 존재하는 것보다 더 느리고 오류가 발생하기 쉽고 더 번거로운 버전을 다시 만드는 것은 무의미해 보입니다.

관련 정보