2014-04-24 2 views
0

파일에 패턴 목록이 있습니다. 패턴은 0, 1, 2 또는 3의 조합으로 구성된 8 개의 문자로 구성됩니다. 나는 적어도 5 개의 3을 포함하고 그 나머지는 2의 수를 포함하는 grep을 원합니다. 문자 순서는 중요하지 않습니다. 즉, 33333333, 33333222, 32323333 및 그 밖의 조합을 grep 할 수 있습니다.8 자로 패턴 인식

파일 1

33333333 
22333333 
23232333 
13323332 
22233333 
22323233 
10111111 

출력

33333333 
22333333 
23232333 
13323332 
22233333 

당신은 친절, AWK, 나오지도 리눅스 나에게 펄을 모든 명령을 제안 할 수 없습니다. 감사합니다

+4

투표 수가 0이고 허용되는 답변이 0 인 질문 (이 중 하나를 포함하여 9 개). 이전 질문에서 얻은 해답이 마음에 들지 않았습니까? StackOverflow가 어떻게 작동하는지 알고 있습니까? – Birei

+0

왜'13323332'가 필요한 출력에 있습니까? – Borodin

+0

실수로 죄송합니다. 오타입니다. – firoz

답변

4

이것은 당신이 요구하는 것을 할 것입니다. 그것은 문자를 계산 tr///를 사용하고 라인 최소한 5 개 3의없이 1의 또는 0의가있는 경우에만 (그래서 나머지는 2의이어야 함)

perl -ne 'print if tr/3// >= 5 and tr/10// == 0' myfile.txt 
+0

제로는 어떨까요? –

+0

@LeeDuhem : 감사. 나는 그것을 놓쳤다. – Borodin

+0

코드 주셔서 감사합니다 – firoz

2

단순히 문자를 계산하는 것은 명확를 인쇄 깨지기 쉽다.

그러나 비교의 요점으로 여기에 정규 표현식 솔루션이 있습니다. 이것이 더 짧지 만, 나는 여전히 다른 것에 투표 할 것입니다.

perl -ne 'print if /^(2*3){5}[23]*$/' myfile.txt 

업데이트 - 정규식

use strict; 
use warnings; 

while (<DATA>) { 
    if (m{ 
     ^   # Anchor at start of string 
     (
      2*  # Any number of 2's 
      3  # followed by a 3. 
     ){5}  # group repeated 5 times. (ensures we have at least 5 3's) 
     [23]*  # Any number of 2 or 3's 
     $   # Anchor at end of string 
    }x) { 
     print; 
    } 

} 

__DATA__ 
33333333 
22333333 
23232333 
13323332 
22233333 
22323233 
10111111 

출력의 고장이 당신을 위해 작동 할 수

33333333 
22333333 
23232333 
22233333 
+0

코드 주셔서 감사합니다. 친절하게 설명해 주실 수 있습니까? (2 * 3) {5} [23]. – firoz

+0

정규 표현식을 설명하기 위해 주석이 추가 된 버전입니다. – Miller

1

(GNU가 나오지도) :

sed -n 'h;s/3/&/5;T;s/[23]//g;/^$/{g;p}' file 

복사 줄이 5 개이면 3 '이면 모두 3'및 2 '을 제거하고 줄이 비어 있으면 복사 된 줄을 검색하여 인쇄하십시오.