我有 2 个文件,其中包含测试编号、测试名称、种子值、状态(通过或失败)和测试类型(mcu 或 bfm)。我唯一关注的两列是测试名称和状态。我运行了一些测试,这些测试是我的总测试的子集,并生成了具有上述格式的日志文件,并想要进行比较以查看测试的状态是否已更改; atkdiff
不起作用,因为文件不相同。如何进行比较以查看我的测试子集与主测试文件是否存在差异?除非有 400 多个测试,否则我会手工完成。
例子:
子集测试
|---------|------------------------------------------------------------------------------|-------|-----------|------------|
|Sr.Num |test_name |seed |Status |XDATA MASTER|
|---------|------------------------------------------------------------------------------|-------|-----------|------------|
| 1| usb3_bootrom_flex_connect| 1| PASSED| MCU|
| 2| usb3_XTAL_25MHZ_bootrom| 1| PASSED| MCU|
所有测试文件
|---------|------------------------------------------------------------------------------|-------|-----------|------------|
|Sr.Num |test_name |seed |Status |XDATA MASTER|
|---------|------------------------------------------------------------------------------|-------|-----------|------------|
| 50| usb3_bootrom_flex_connect| 1| FAILED| MCU|
| 200| usb3_XTAL_25MHZ_bootrom| 1| FAILED| MCU|
输出文件:
usb3_bootrom_flex_connect New: PASSED Old: FAILED usb3_XTAL_25MHZ_bootrom New: PASSED Old: FAILED
测试子集:https://pastebin.com/9rWAupaJ
所有测试:https://pastebin.com/cVpzY8C8
我只是想看看子集测试的状态是否发生了变化。我如何做到这一点并不重要。如果我能用 tkdiff 做到这一点,我会的。
答案1
也许您可以使用大量cut
ting 和grep
ping来执行某些操作tkdiff
,但您可以使用单个sed
脚本来完成该工作:
sed -n -e '3{:a' -e 'n;s/.* \([^|]*\)| *[0-9]*| *\([A-Z]*\).*/\1 \2/;H;ta}
G;s/^|[^|]*| *\([^|]*\)| *[0-9]*| *\([A-Z]*\).*\1 \([A-Z]*\).*/\1 New: \2 Old: \3/p' tests.new tests.old
第一行在保留空间中收集新的测试结果,第二行扫描旧测试的行,将测试名称与保留空间中的测试名称进行比较,并打印匹配的行。
有关该原理的详细解释,请参见这个答案。
请注意,对于较大的新测试文件,由于带有反向引用的正则表达式,此脚本可能会变慢。