열별로 중복 행 가져오기 또는 필터링

열별로 중복 행 가져오기 또는 필터링

세 개의 열이 있는 파일이 있는데 세 번째 열에 중복 행을 가져오고 싶습니다. 예를 들면 다음과 같습니다.

AAA = 342  
BLABLABLA = 2  
BBBx2 = 23  
1+1 = 2  
KOKOKO= 5  
2x1 = 2  

출력은 다음과 같아야 합니다.

BLABLABLA = 2  
1+1 = 2  
2x1 = 2  

sort를 사용해 보았지만 uniq중복된 줄이 제거되어 인쇄하고 싶습니다.

답변1

당신이 관심이 있는 한마지막열의 경우 sortsum을 사용하여 이를 수행 할 수 있습니다 uniq.

$ sort -k3n test.txt |  uniq  -f2 -D
1+1 = 2
2x1 = 2
BLABLABLA = 2

여기서 정렬 옵션을 사용 -k3n하면 파일이 세 번째 필드부터 숫자순으로 정렬됩니다 uniq.

-f2   Skip the first two fields before checking for uniqueness
-D    Print all the repeated lines

안타깝게도 고유성을 확인하려는 필드 수를 제어할 수 없습니다. 확인할 문자 수를 지정 하는 데 사용할 수 있지만 -w이는 관심 있는 필드가 고정 너비인 경우에만 도움이 됩니다.

또한 후행 공백에 유의하세요. 고유성을 확인할 텍스트에 포함됩니다.

답변2

유니크를 사용하세요.

uniq -f 3 <file name>

답변3

@rici의 답변은 정확합니다. 하지만 이는 -DGNU 확장입니다.

이것은 awk 솔루션입니다. 한 번 실행되지만 이전 행을 저장합니다.

sort -k3n <file name> | awk 'a[$3]++{ if(a[$3]==2){ print b }; print $0}; {b=$0}'

답변4

gawk -F'= ' '{d[$2][a[$2]++]=$0} END{for (i in a) {if (a[i] > 1) for (j in d[i]) {print d[i][j]}}}'

설명하다:

각 행($0)에 대해 "="로 구분된 두 번째 필드($2)를 가져와서 해당 필드를 해시 "a"의 키로 사용하여 해당 필드의 발생 횟수를 계산하고 해당 필드를 두 차원 모두로 사용합니다. 차원 해시 'd'이며, 필드는 현재 행($)의 값을 저장하기 위한 두 번째 차원 키로 해시 'a' 값을 참조합니다. 마지막으로 값이 1보다 큰(중복을 의미) 'a'의 모든 요소를 ​​반복하고 해당 값 'd'를 인쇄합니다.

참고: 이 줄은 정렬이 필요하지 않지만 메모리를 소비합니다.

관련 정보