다섯 번째 열에 다른 값이 있지만 동일한 두 번째 열을 공유하는 행을 찾는 방법은 무엇입니까?

다섯 번째 열에 다른 값이 있지만 동일한 두 번째 열을 공유하는 행을 찾는 방법은 무엇입니까?

나는 다음을 가지고 있습니다 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

그러나 나는 더 적은 수의 파이프를 사용하는 더 효율적인 방법을 찾고 있습니다.불다그리고스크립트로 또는 명령줄에서.

출력은 유사할 수도 있고 전체 라인이 인쇄될 수도 있습니다. 위 출력의 문제점은 주어진 두 번째 열의 모든 항목을 표시하지 않는다는 것입니다. 마지막 줄도 고려되지 않습니다 ( 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 ...

관련 정보