mytestN.out과 testN.out을 모두 비교하는 Bash 명령/스크립트

mytestN.out과 testN.out을 모두 비교하는 Bash 명령/스크립트

모든 입력 파일을 테스트하고 해당 개수의 출력 파일을 생성할 실행 파일이 있습니다(이 부분은 제가 할 수 있습니다). 그런 다음 새로 생성된 파일(mytestN.out)을 올바른 출력(testN.out)이 있는 파일과 비교하고 이를 difftestN.txt라는 파일로 파이프합니다. 그런 다음 각 difftest.txt를 확인하고 비어 있으면 "성공"을 인쇄하고, 그렇지 않으면 "차이 발견"을 인쇄합니다.

예를 들어, 나는 할 것입니다

./Executable < test1.in > mytest1.out

N test.in의 경우. 나는 이것을 사용하여 이것이 가능하다는 것을 알았습니다.

for f in test*.in; do ./tetris <"$f" >"my${f%in}svg"; done

그런 다음 모든 mytest.out 및 모든 test.out에 대해 diff 명령을 수행합니다.

diff mytest1.out test1.out > difftest1.txt

모든 testN에 대해 이 작업을 수행하는 방법을 잘 모르겠습니다. 나는 이것이 올바른 접근 방식이라고 생각합니다.

for f in mytest*.svg; do diff "$f" "###what goes here?###" > "diff${f%in}txt"; done

하지만 "$f" 다음에 무슨 일이 일어날지 모르고 차이점이 diffmytestN.txt로 전달되지만 difftestN.txt를 원합니다.

그런 다음 각 difftest.txt를 확인하고 비어 있으면 "성공"을 인쇄하고 비어 있지 않으면 "차이 발견"을 인쇄하고 싶습니다.

답변1

언급한 파일 수에 관계없이 이를 조정할 수 있습니다. 다음은 제가 사용한 4개의 테스트 파일의 내용입니다: test1: 1 mytest1: 1 test2: 2 mytest2: 2

for i in {1..2}; do 
    diff test${i}.out mytest${i}.out &>/dev/null
    es=$?
    if [ $es -ne 0 ]; then 
        echo "difference found"
    else 
        echo "success"
    fi
done

산출:

difference found
success

귀하가 diff 출력 파일을 저장하도록 요청했기 때문에 귀하의 질문에 문자 그대로 대답하지 않았다는 것을 알고 있습니다. 꼭 이 작업을 수행해야 한다면 코드를 변경할 수 있습니다.

  diff test${i}.out mytest${i}.out > difftest${i}.txt

  if ! [[ -s difftest${i} ]]; then 
      echo success
  else
      echo "difference found"
  fi

프로그램이 내용이 있는 파일을 존재하지 않는 파일과 비교하려고 시도하면 파일과 존재하지 않는 파일 문서 사이에 상당한 차이가 있는 것처럼 보이는 stderr 출력을 생성한다는 점을 기억하는 것이 유용할 수 있습니다. . stdout만 *.txt에 들어가므로 괜찮습니다.

관련 정보