我有以下内容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 ...