A melhor maneira de comparar arquivos de texto é com o comando diff
:
diff output1.txt output1.txt
Para uma comparação de massa, você pode chamar diff
em um loop:
for x in input*.txt; do
slow-program <"$x" >"$x.out-slow"
fast-program <"$x" >"$x.out-fast"
diff "$x.out-slow" "$x.out-fast"
done
Se o snippet acima produzir alguma saída, seu programa rápido está com bugs. No bash / ksh / zsh, você não precisa armazenar os arquivos intermediários no disco. No entanto, isso não é necessariamente uma coisa boa, uma vez que é provável que seja útil inspecionar os diferentes resultados em seu próprio ritmo.
for x in input*.txt; do
diff <(slow-program <"$x") <(fast-program <"$x")
done
Pode ser mais conveniente colocar entradas e saídas em diretórios separados e realizar um diff recursivo.
for x in inputs/*; do slow-program <"$x" >"slow/${x##*/}"; done
for x in inputs/*; do fast-program <"$x" >"fast/${x##*/}"; done
diff -ru slow fast
Minha recomendação seria escrever um makefile que executa os testes e executa as comparações (em destinos separados). (Use abas onde eu coloquei 8 espaços.)
all_test_inputs = $(wildcard input*.txt) # relies on GNU make
%.out-slow: %.txt slow-program
./slow-program <$< >[email protected]
mv [email protected] $@
%.out-fast: %.txt fast-program
./fast-program <$< >[email protected]
mv [email protected] $@
%.diff: %.out-slow %.out-fast
-diff $*.out-slow $*.out-fast >[email protected]
mv [email protected] $@
# Test that all diff files are empty
test: $(all_test_inputs:%.txt=%.diff)
for x in $^; do ! test -s "$x"; done
.PHONY: test
Execute make test
para processar todos os arquivos de entrada (somente para os arquivos de entrada ou os programas que foram alterados desde a última vez) e compare os resultados. O comando será bem-sucedido se, e somente se, todos os testes forem executados corretamente e a saída de ambos os programas for idêntica em cada caso.