5番目の列に異なる値がありますが、同じ2番目の列を共有する行を見つける方法は?

5番目の列に異なる値がありますが、同じ2番目の列を共有する行を見つける方法は?

私は以下を持っています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-1232番目に大きいファイルには効率的ではありません。

有効な予想結果は次のとおりです。

  • がある行には、のR:123-1232つの異なるパラメータがあるからですAAAXYZ
  • がある行には、のR:123-1262つの異なるパラメータがあるからですDDDEEE
  • がある行には、のR:123-4562つの異なるパラメータがあるからですXXXYYY

どうすればこれをより効率的に達成できますか?

ベストアンサー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 ...

おすすめ記事