세 개의 열이 있는 파일이 있는데 세 번째 열에 중복 행을 가져오고 싶습니다. 예를 들면 다음과 같습니다.
AAA = 342
BLABLABLA = 2
BBBx2 = 23
1+1 = 2
KOKOKO= 5
2x1 = 2
출력은 다음과 같아야 합니다.
BLABLABLA = 2
1+1 = 2
2x1 = 2
sort
를 사용해 보았지만 uniq
중복된 줄이 제거되어 인쇄하고 싶습니다.
답변1
당신이 관심이 있는 한마지막열의 경우 sort
sum을 사용하여 이를 수행 할 수 있습니다 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의 답변은 정확합니다. 하지만 이는 -D
GNU 확장입니다.
이것은 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'를 인쇄합니다.
참고: 이 줄은 정렬이 필요하지 않지만 메모리를 소비합니다.