Если они имеют одинаковые тестовые случаи, вы можете просто объединить два файла в отсортированном виде, а затем использовать awk
для обработки результирующего потока, сохраняя первый раз для каждой пары и затем вычисляя во второй раз.
Что-то вроде следующего транскрипта:
pax:~$ cat file1
TEST CASE 1: 0.004 seconds
TEST CASE 2: 0.043 seconds
TEST CASE 3: 0.234 seconds
TEST CASE 4: 0.564 seconds
pax:~$ cat file2
TEST CASE 1: 0.003 seconds
TEST CASE 2: 0.040 seconds
TEST CASE 3: 0.134 seconds
TEST CASE 4: 0.664 seconds
pax:~$ ( cat file1 |sed 's/:/: A /' ; cat file2 |sed 's/:/: B /' ) |sort |awk '{
if (state == 0) {
before = $5;
state = 1;
} else {
print before" -> "$5" ("("int(100 * $5 / before - 100)"%)")"
state = 0;
}
}'
0.004 -> 0.003 (-25%)
0.043 -> 0.040 (-6%)
0.234 -> 0.134 (-42%)
0.564 -> 0.664 (17%)
Вот как это работает.Подоболочка ( ... )
изменяет оба файла, поэтому они будут правильно сортироваться с помощью простой команды sort
в следующее:
TEST CASE 1: A 0.004 seconds
TEST CASE 1: B 0.003 seconds
TEST CASE 2: A 0.043 seconds
TEST CASE 2: B 0.040 seconds
TEST CASE 3: A 0.234 seconds
TEST CASE 3: B 0.134 seconds
TEST CASE 4: A 0.564 seconds
TEST CASE 4: B 0.664 seconds
Другими словами, в пары значений до и после.awk
имеет миниатюрный автомат с двумя состояниями.В нулевом состоянии он просто сохраняет время до и устанавливает состояние равным единице.В первом состоянии он вычисляет и печатает требуемые значения, прежде чем вернуть состояние в ноль.
Если вы хотите, чтобы номер тестового набора был включен, и естественную сортировку можно использовать (после добавления тестового примера 10 квходные файлы):
pax:~$ ( cat file1 |sed 's/:/: A /' ; cat file2 |sed 's/:/: B /' ) |sort |awk '{
if (s == 0) {
s = 1;
before = $5;
} else {
s = 0;
printf "%5s %s->%s (%d%%)\n", $3, before, $5, int(100 * $5 / before - 100)
}
}' |sort -n
1: 0.004->0.003 (-25%)
2: 0.043->0.040 (-6%)
3: 0.234->0.134 (-42%)
4: 0.564->0.664 (17%)
10: 0.564->0.764 (35%)