私は以下を持っています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
コラムに興味があります。
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
しかし、私はより少ない数のパイプを使用するより効率的な方法を探しています。吹くそしてアッスクリプトとしてまたはコマンドラインから。
出力は類似しているか、ライン全体を印刷できます。上記の出力の問題は、与えられた2番目の列のすべての項目が表示されないことです。最後の行も考慮されません(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
2番目に大きいファイルには効率的ではありません。
有効な予想結果は次のとおりです。
- がある行には、の
R:123-123
2つの異なるパラメータがあるからですAAA
。XYZ
- がある行には、の
R:123-126
2つの異なるパラメータがあるからですDDD
。EEE
- がある行には、の
R:123-456
2つの異なるパラメータがあるからです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 ...