Linux에서 추출 줄이 연속으로 3번 이상 나타납니다.

Linux에서 추출 줄이 연속으로 3번 이상 나타납니다.

Linux에 테이블이 있습니다.

A 0
A 0
A 0
B 0
B 1
B 0
B 1
B 0

연속으로 3번 이상 나타나는 행을 추출하고 싶습니다.

내 예상 결과는 다음과 같습니다

A 0

사실 3번 이상은 단순한 예시일 뿐입니다. 실제 상황은 연속으로 30번 이상 나타나는 행을 추출하고 싶은 것입니다.

어떤 아이디어가 있나요?

감사합니다!

답변1

uniq -c file | awk '$1 >= 3 { print $2,$3 }'

uniq -c각 줄은 해당 줄의 연속 발생 횟수와 함께 출력됩니다 . 주어진 데이터에 대해

   3 A 0
   1 B 0
   1 B 1
   1 B 0
   1 B 1
   1 B 0

awk첫 번째 필드가 3보다 크거나 같으면 스크립트는 이 값을 사용하여 마지막 두 필드를 출력합니다.

결과는 다음과 같습니다

A 0

답변2

간단한 것은 awk다음과 같이 사용할 수 있습니다.

awk '{!s[$0]++} END{for (x in s) if (s[x]>2) print x}' infile

2회 이상 반복되지만 >2전체적으로 반복되는 행을 인쇄합니다. >29라인이 ≥‎30회 반복되도록 설정할 수 있습니다 .

@Philippos가 지적한 대로 다음 명령을 사용하여 3회 이상 반복되는 연속 행만 인쇄할 수 있습니다.

awk 'p!=$0{n=0} {p=$0;n++} (n==3)'

설명: 이전 행을 에 저장하고 p, 의 행 수를 계산하고 n, 행이 이전 행과 다른 경우 카운터를 재설정합니다. 번째 ( 또는 30번째 ) 발생 시 인쇄합니다.


또는 동일한 효과를 얻는 짧은 방법도 있습니다.

awk 'p!=$0{n=0;p=$0} ++n==3'

답변3

sed순수버전이 빠졌네요! 이렇게 하면 됩니다:

sed 'x;G;s/\(.*\)\n\1$/+\1/;/\n/d;h;s/^+\{2\}//;/^+/d' file

2을 연속 30줄로 바꾸세요 29. 이것이 어떻게든 최적화될 수 있는지 궁금합니다.

작동 방식: 예약된 공간에서 이전 줄은 유지되고 +해당 줄이 추가로 발생할 때마다 지시선이 추가됩니다. 이제 각 행에 대해 x버퍼가 교체되므로 현재 행은 예약된 공간에 있습니다. 공간은 추가로 G예약되어 있으므로 패턴 공간에는 새 줄로 구분된 이전 줄과 새 줄이 있습니다. 이제 줄 바꿈 앞뒤에 줄이 나타나면 두 개의 동일한 줄이 있으며 이 s명령은 줄 중 하나와 줄 바꿈을 로 대체합니다 +. 패턴에 여전히 줄 바꿈이 있으면 줄이 다르므로 시작할 수 있습니다. 새로운 루프( /\n/d). 그렇지 않으면 수정된 행을 수집을 위해 예약된 공간에 복사합니다 +. 마지막으로 +필요한 행 수(1개 행 제외)를 삭제합니다. 여전히 선행 행이 있는 경우 +너무 많거나 충분하지 않은 행을 수집하여 d삭제합니다.

답변4

싱글로스크립트:

awk '{k=$1 FS $2}!a[k] || (NR==n && k==pk){ a[k]++; pk=k; n=NR+1 }
     END{ for(i in a) if(a[i] >=3) print i }' file

  • k=$1 FS $2- 키 키, 첫 번째 및 두 번째 필드 연결

  • !a[k] || (NR==n && k==pk)- 기록이 처음으로 발생하는지, 이전 기록과 동시에 발생하는지 확인


산출:

A 0

관련 정보