我有以下内容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
专栏感兴趣。
我想从第 5 列中找到与第 2 列中相同值不同的所有值。
这是我所拥有的:
$ awk '{print $5" "$2}' file.log | uniq -s3 -c | sort -nr | grep -vw 1
2 XXX R:123-456
2 DDD R:123-126
但我正在寻找使用更少管道的更有效方式,理想情况下使用Bash和Awk作为脚本或从命令行。
输出可以是相似的,也可以打印整行。上述输出的问题是,它没有显示给定第二列的所有出现。最后一行也没有考虑到(XYZ
)。
我还可以在Bash中编写以下内容:
$ 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
.
如何更有效地实现这一目标?
Awk
+sort
解决方案:输出: