【问题标题】:How to select only the lines that appears once based in two columns?如何仅选择基于两列出现一次的行?
【发布时间】:2018-07-20 10:48:14
【问题描述】:

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

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

【问题讨论】:

  • 你有什么问题?您要检查的字段显然是$6$8。您可以将它们与arr[$6 $8] 连接到索引键中,如果您想要它们之间的分隔符,只需添加一个,例如arr[$6 ":" $8]
  • 如何打印“suite”和“case”列的连接只出现一次的行的整个值
  • END 块中,$0 是文件中的最后一行,因此您更新后的尝试将简单地打印最后一行,与匹配的次数一样多。

标签: shell awk sh


【解决方案1】:

这是一个想法。不要增加计数器,而是将此键的数组值设置为行(也可以是行号和文件名),当您看到之前已经看到的键时,将其更改为哨兵值。我选择数字零是因为它在布尔上下文中很方便地计算为“不正确”。

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

【讨论】:

  • 酷,我需要一些时间来消化所有这些,但它似乎有效!谢谢!
猜你喜欢
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
相关资源
最近更新 更多