如何仅选择基于两列显示一次的行?

时间:2018-02-09 16:00:27

标签: shell awk sh

我有一个这种模式的文件:

start: 1 elapsed: 1 suite: path.to.class case: method

我想打印整个值的行,其中suitecase值的串联只出现一次。例如:

输入

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

1 个答案:

答案 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会跳过当前行的其余脚本。如果我们失败了,这是第一次出现这个键,所以如果我们再没有看到它,请收集我们想要打印的信息。当我们完成阅读时,打印非零条目。