我有一个这种模式的文件:
start: 1 elapsed: 1 suite: path.to.class case: method
我想打印整个值的行,其中suite
和case
值的串联只出现一次。例如:
输入
start: 1 elapsed: 2 suite: com.path.class case: sampleMethod1
start: 1 elapsed: 2 suite: com.path.class case: sampleMethod2
start: 1 elapsed: 2 suite: com.path.class case: sampleMethod2
start: 1 elapsed: 2 suite: com.path.class case: sampleMethod3
start: 1 elapsed: 2 suite: com.path.class case: sampleMethod3
start: 1 elapsed: 2 suite: com.path.class2 case: sampleMethod1
start: 1 elapsed: 2 suite: com.path.class2 case: sampleMethod1
预期输出
start: 1 elapsed: 2 suite: com.path.class case: sampleMethod1
这与this问题非常相似,但是,它只会打印检查相等性的列。我最好的尝试是:
awk '{arr[$6,$8]++} END {for (i in arr) {if (arr[i]==1) {print $0} }}' filename
但它会打印:start: 1 elapsed: 2 suite: com.path.class2 case: sampleMethod1
答案 0 :(得分:2)
这是一个想法。而不是递增计数器,将此键的数组值设置为该行(也可能是行号和文件名),当您看到之前已经看过的键时,将其更改为标记值。我选择了数字零,因为它在布尔上下文中方便地计算为“not true”。
awk '($6 ":" $8 in arr) { arr[$6 ":" $8] = 0; next }
{ arr[$6 ":" $8] = FILENAME ":" NR ":" $0 }
END { for (k in arr) if (arr[k]) print arr[k] }' file
如果我们看到之前看到过的密钥,请将其在数组中的值更改为零。 next
会跳过当前行的其余脚本。如果我们失败了,这是第一次出现这个键,所以如果我们再没有看到它,请收集我们想要打印的信息。当我们完成阅读时,打印非零条目。