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