2014-03-26 2 views
2

예를 들어 [email protected]#%과 같은 특수 문자를 생략 한 것으로 보이는 egrep에 문제가 있습니다.egrep 특수 문자를 지우지 마십시오

목표는 정확히 3 자 이상 동일한 줄을 제거하는 것입니다. 문자는 각각에 따라 달라질 필요는 없습니다.

cat file1.txt | egrep -vi "^(.*)(.{3,})(.*)\2(.*)$" > file2.txt 

그것은 nonspecial 캐릭터에 잘 작동하지만 같은 파일을 제거하지 않습니다 여기에

111!!!qqq! #should be removed because has 4 '!' 
!1!1!opop #is fine 

내가 사용하고 것입니다.

미리 감사드립니다.

+0

저는 이것이 특수 문자에 대한 링크라고 생각하지 않습니다 ... 테스트 케이스를 제공 할 수 있습니까? 올바른 줄만'file2' 또는 잘못된 줄로 인쇄하고 싶습니까? – Robin

답변

3

사용이 하나

cat input.txt | egrep -vi "(.).*\1.*\1.*\1" 

(.)은 (\1)에있는 세 개의 동일한 문자가 다음에 있는지 확인 후 모든 문자를 캡처하고 있습니다.

+1

'egrep ... input.txt'을 직접 수행 할 수 있습니다.'cat'을 사용할 필요가 없습니다. – fedorqui

+3

'egrep '(. * 1) {3}'input.txt' – Toto

+1

'cat'을 사용하여 예제를 게시하여 데이터를 읽을 수있는 프로그램에 데이터를 입력하면 안됩니다. – Jotne

0

또한이 문제를 해결하기 위해 awk를 사용할 수 있습니다

awk '{delete a;for (i=1;i<=NF;i++) if (++a[$i]>3) next}1' FS="" file 
!1!1!opop 

루프 라인의 모든 문자를 실행 FS=""을 설정하면.
는 그 다음 a라는 이름의 배열이 저장 위치를 ​​증가 및 테스트의 경우 것이다 그 큰 다음 3
의 더 큰 다음, 다음 행으로 건너 next를 사용하는 경우. 건너 뛰지 않으면 1이 인쇄합니다.

관련 문제