如何查找第五列中具有不同值但共享相同第二列的行?

如何查找第五列中具有不同值但共享相同第二列的行?

我有以下内容file.log

2018.03.02 R:123-123 [Debug] Parameters AAA ...
2018.03.02 R:123-124 [Debug] Parameters BBB ...
2018.03.02 R:123-125 [Debug] Parameters CCC ...
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...
2018.03.02 R:456-456 [Debug] Parameters ZZZ ...
2018.03.02 R:123-123 [Debug] Parameters XYZ ...

我主要对阅读$2$5专栏感兴趣。

我想找到第五列中的所有值,这些值与第二列中的相同值不同。

这是我所得到的:

$ awk '{print $5" "$2}' file.log | uniq -s3 -c | sort -nr | grep -vw 1
      2 XXX R:123-456
      2 DDD R:123-126

但我正在寻找更少管道的更有效方法,最好使用重击awk作为脚本或从命令行。

输出可以类似,也可以打印整行。上述输出的问题是,它没有显示给定第二列的所有出现情况。最后一行也不考虑在内 ( XYZ)。

我也可以写以下内容重击:

$ grep -f <(awk '{print $5" "$2}' file.log | uniq -s3 -c | sort -nr | grep -vw 1 | awk '{print $3}') file.log
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...

但该命令不会打印带有 的行R:123-123,其次它对于较大的文件效率不高。

有效的预期结果是:

  • 带有 , 的行R:123-123,因为它们有两个不同的参数:AAA, XYZ
  • 带有 , 的行R:123-126,因为它们有两个不同的参数:DDD, EEE
  • 带有 , 的行R:123-456,因为它们有两个不同的参数:XXX, YYY

如何更有效地实现这一目标?

答案1

Awk+sort解决方案:

awk 'a[$2]++ && $5 != f5{ print r ORS $0 }{ r=$0; f5=$5 }' <(sort -k2,2 file)

输出:

2018.03.02 R:123-123 [Debug] Parameters AAA ...
2018.03.02 R:123-123 [Debug] Parameters XYZ ...
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...

相关内容